C语言实现单链表的创建及基本操作
往期文章:C语言实现顺序表的创建及基本操作
这次主要是分享一下数据结构中单链表的创建及基本操作,这一部分也是属于比较基础的内容。但是越基础的东西我们越要投入精力去学习,不能眼高手低。我在编写这一部分的内容时就出现了许多错误,这也算是一次查漏补缺的博客吧,下面我们正式开始。
- 单链表的结构定义
首先我们先来看一下常规定义的单链表,一般情况下会包含数据域和指针域。例如:
typedef struct node{
//单链表的结构定义
int data;//定义int类型的数据域
struct node *next; //定义指针域
}node,*linklist;
这个地方会出现两个让人比较迷的东西:结构指针node和linklist。本质上而言,这两种类型是等价的。通常用linklist说明指针变量,强调它是某个单链表的头指针变量,定义为linklist L,L表示头指针。node用来定义单链表中结点的指针,例如node *p,p为结点的指针变量,p也可以定义为头结点。但是在方法的编写时,这两种定义会混合使用,非常容易迷惑我们的思维。所以我接下来的所有方法都只使用node来定义。
- 单链表的初始化
node *startlist(node *l){
//初始化单链表 并设置为空表
l=(node *)malloc(sizeof(node));
l->next=NULL;//使头结点的指针域为空,建立一个空的单链表
return l;
}
我这里有一个错误点,在方法体内为头结点分配内存空间的时候要注意,必须要返回指针,否则分配的内存在本方法运行结束后就会释放,相当于没分配内存。当然你也可以使用下面的方法,并在主函数中分配内存。
void startlist(node *l){
//初始化单链表 并设置为空表
l->next=NULL;//使头结点的指针域为空,建立一个空的单链表
}
int main(){
node *l,*m;
l=(node *)malloc(sizeof(node));//建立一个头结点 并动态分配存储空间
return 0;
}
- 头插法建立单链表
void creatfromhead(node *l) {
//利用头插法建立单链表
node *p;//新建一个结点指针
int i=1;
int j;
while(i!=0){
scanf("%d",&j);
if(j!=-1){