首先我们来看一下链表的概念
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
首先我们来讨论一下单链表,通过任意的存储单元来存储线性表的数据元素,即每个节点由一个数据元素以及下个节点的指针组成。
首先我们对数据以及节点的类型做一个描述,我们直接上代码:
我们先创建一个头文件Linklist.h来做对数据的描述
#ifndef_Linklist#define_Linklist#includestdio.h#includestdlib.htypedefintElemType;typedefstructLNode{ElemTypedata;structLNode*next;}LNode;#endif
我们接下来讲链表的基础操作,链表的建立
头插法建立链表
头插法我们可以从一个空表开始,生成一个新结点,将数据存放到新界中,让后将该结点插入链表表头,上代码
voidList_HeadInsert(LNode**root,ElemTypedata){ LNode*node=*root; if((*root)==NULL) { (*root)=(LNode*)calloc(1,sizeof(LNode)); assert((*root)); (*root)-data=data; } else{ LNode*item=calloc(1,sizeof(LNode)); assert(item); item-data=data; item-next=node; (*root)=item; }}
尾插法建立链表
该方法是将新结点插入到链表的表尾,即生成一个新节点,将新节点赋值给最后一个结点的next,上代码
voidList_TailInsert(LNode**root,ElemTypedata){ LNode*node=*root; if((*root)==NULL) { (*root)=(LNode*)calloc(1,sizeof(LNode)); assert((*root)); (*root)-data=data; } else{ while(true) { if(node-next==NULL) { LNode*item=calloc(1,sizeof(LNode)); assert(item); item-data=data; node-next=item; break; } node=node-next; } }}
我们来测试一下代码
voidmain(){ LNode*node=NULL; LNode*node1=NULL; List_TailInsert(node,1); List_TailInsert(node,2); //这里我们将node的地址传入给函数,所以我们函数就是修改的值 List_HeadInsert(node1,1); List_HeadInsert(node1,2); printf("%d",node-next-data); printf("%d",node1-data);}//这里我们的输出都为2