栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构-C语言代码 day 2-单链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构-C语言代码 day 2-单链表

1.链表的概念 单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。以“结点的序列”表示的线性表称作线性链表(单链表),单链表是链式存取的结构。对于链表的每一个结点,我们使用结构体进行设计,其主要内容有:

单链表结构特点 其中,DATA数据元素,可以为你想要储存的任何数据格式,可以是数组,可以是int,甚至可以是结构体(结构体套结构体);NEXT为一个指针,其代表了一个可以指向的区域,通常是用来指向下一个结点,链表的尾部NEXT指向NULL(空),因为尾部没有任何可以指向的空间了。 以下:单链表的创建, 添加, 插入, 删除.

下面为临摹老师的代码:

(1).创建链表

typedef struct LinkNode
{
	char data;
	struct LinkNode *next;
 } LNode,*LinkList,*NodePtr;

(2).建立头节点(初始化)

生成新结点作为头结点,用头指针指向头结点——头结点的指针域置空

 头结点和头指针的区分:不管带不带头结点,头指针始终指向单链表的第一个结点,而头结点是带头结点的单链表中的第一个结点,结点内通常不存储信息。

LinkList initLinkList()
 {
 	NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
 	tempHeader->data = '';
 	tempHeader->next = NULL;
 	return tempHeader;
 }

(3).输出当前链表

void printList(NodePtr paraHeader)
 {
 	NodePtr p = paraHeader->next;
 	while(p!=NULL)
 	{
 		printf("%c",p->data);
 		p = p->next;
	 }
	 printf("rn");
 }

(4).尾插法插入

 void appendElement(NodePtr paraHeader,char paraChar)
 {
 	NodePtr p,q;
 	
 	q = (NodePtr)malloc(sizeof(LNode));
 	q->data = paraChar;
 	q->next = NULL;
 	
 	p = paraHeader;
 	while(p->next!=NULL)
 	{
 		p = p->next;
	 }
	 
	 p->next = q;
  }

(5).指定位置插入

 void insertElement(NodePtr paraHeader,char paraChar,int paraPosition)
  {
  	NodePtr p,q;
  	
  	p = paraHeader;
  	for(int i = 0;i < paraPosition;i++)
  	{
  		p = p->next;
  		if(p==NULL)
  		{
  			printf("The position %d is beyond the scope of the list.",paraPosition);
  			return;
		  }
	  }
	  
	  q=(NodePtr)malloc(sizeof(LNode));
	  q->data = paraChar;
	  
	  printf("linkingrn");
	  q->next = p->next;
	  p->next = q;
  }

(6).删除指定元素

 void deleteElement(NodePtr paraHeader,char paraChar)
  {
  	NodePtr p,q;
  	p = paraHeader;
  	while((p->next!=NULL)&&(p->next->data!=paraChar))
  	{
  		p=p->next;
	  }
	  
	  if(p->next==NULL)
	  {
	  	printf("Cannot delete %crn",paraChar);
	  	return;
	  }
	  q=p->next;
	  p->next=p->next->next;
	  free(q);
  }

 (7).测试

void appendInsertDeleteTest()
  {
	LinkList tempList = initLinkList();
	printList(tempList);

	appendElement(tempList, 'H');
	appendElement(tempList, 'e');
	appendElement(tempList, 'l');
	appendElement(tempList, 'l');
	appendElement(tempList, 'o');
	appendElement(tempList, '!');
	printList(tempList);

	deleteElement(tempList, 'e');
	deleteElement(tempList, 'a');
	deleteElement(tempList, 'o');
	printList(tempList);

	insertElement(tempList, 'o', 1);
	printList(tempList);
  }

全部代码展示:

#include
#include


typedef struct LinkNode
{
	char data;
	struct LinkNode *next;
 } LNode,*LinkList,*NodePtr;
 
 
 LinkList initLinkList()
 {
 	NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
 	tempHeader->data = '';
 	tempHeader->next = NULL;
 	return tempHeader;
 }//Of initLinkList
 
 
 void printList(NodePtr paraHeader)
 {
 	NodePtr p = paraHeader->next;
 	while(p!=NULL)
 	{
 		printf("%c",p->data);
 		p = p->next;
	 }//of while
	 printf("rn");
 }//of printList
 
 
 void appendElement(NodePtr paraHeader,char paraChar)
 {
 	NodePtr p,q;
 	
	 //step 1.Construct a new node.
 	q = (NodePtr)malloc(sizeof(LNode));
 	q->data = paraChar;
 	q->next = NULL;
 	
	 //step 2.search to the tail.
 	p = paraHeader;
 	while(p->next!=NULL)
 	{
 		p = p->next;
	 }//of while
	 
	 //step 3.Now add/link.
	 p->next = q;
  } //of appendElement
  
  
  void insertElement(NodePtr paraHeader,char paraChar,int paraPosition)
  {
  	NodePtr p,q;
  	
  	//step 1.search to the position.
  	p = paraHeader;
  	for(int i = 0;i < paraPosition;i++)
  	{
  		p = p->next;
  		if(p==NULL)
  		{
  			printf("The position %d is beyond the scope of the list.",paraPosition);
  			return;
		  }//of if
	  }//of for i
	  
	  //step 2.construct a new node.
	  q=(NodePtr)malloc(sizeof(LNode));
	  q->data = paraChar;
	  
	  //step 3.Now link.
	  printf("linkingrn");
	  q->next = p->next;
	  p->next = q;
  }//of insertElement
  
  
  void deleteElement(NodePtr paraHeader,char paraChar)
  {
  	NodePtr p,q;
  	p = paraHeader;
  	while((p->next!=NULL)&&(p->next->data!=paraChar))
  	{
  		p=p->next;
	  }//of while
	  
	  if(p->next==NULL)
	  {
	  	printf("Cannot delete %crn",paraChar);
	  	return;
	  }//of it
	  q=p->next;
	  p->next=p->next->next;
	  free(q);
  }//of deleteElement
  
  
  void appendInsertDeleteTest()
  {
    // Step 1. Initialize an empty list.
	LinkList tempList = initLinkList();
	printList(tempList);

	// Step 2. Add some characters.
	appendElement(tempList, 'H');
	appendElement(tempList, 'e');
	appendElement(tempList, 'l');
	appendElement(tempList, 'l');
	appendElement(tempList, 'o');
	appendElement(tempList, '!');
	printList(tempList);

	// Step 3. Delete some characters (the first occurrence).
	deleteElement(tempList, 'e');
	deleteElement(tempList, 'a');
	deleteElement(tempList, 'o');
	printList(tempList);

	// Step 4. Insert to a given position.
	insertElement(tempList, 'o', 1);
	printList(tempList);
  }// Of appendInsertDeleteTest


void basicAddressTest()
{
	LNode tempNode1, tempNode2;

	tempNode1.data = 4;
	tempNode1.next = NULL;

	tempNode2.data = 6;
	tempNode2.next = NULL;

	printf("The first node: %d, %d, %drn",&tempNode1, &tempNode1.data, &tempNode1.next);
	printf("The second node: %d, %d, %drn",&tempNode2, &tempNode2.data, &tempNode2.next);

	tempNode1.next = &tempNode2;
}// Of basicAddressTest


int main()
{
	appendInsertDeleteTest();
}// Of main

 2.insertElement()函数更多测试
void appendInsertDeleteTest() {

	LinkList tempList = initLinkList();
	printList(tempList);


	appendElement(tempList, 'H');
	appendElement(tempList, 'e');
	appendElement(tempList, 'l');
	appendElement(tempList, 'l');
	appendElement(tempList, 'o');
	appendElement(tempList, '!');

	//多加几个字符测试一下
	appendElement(tempList, '!');
	appendElement(tempList, '!');
	appendElement(tempList, '!');
	appendElement(tempList, 'S');
	appendElement(tempList, 'W');
	appendElement(tempList, 'P');
	appendElement(tempList, 'U');

	printList(tempList);


	deleteElement(tempList, 'U');
	deleteElement(tempList, 'P');
	deleteElement(tempList, 'S');
	deleteElement(tempList, 'W');


	deleteElement(tempList, 'A');
	printList(tempList);


	insertElement(tempList, 'o', 1);
	printList(tempList);
}

运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/854313.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号