C语言基础 单链表(上)

定义:
如果在链表中,每个结点只有一个指针,所有结点都是单线联系,除了末尾结点指针为空外,每个结点的指针都指向下一结点,一环扣一环形成一条线性链,称此链表为单向先行链表,简称单链表。
特点:
(1)有一个head指针变量,他存放第一个结点的地址,称为头指针。
(2)每个结点都包含一个数据域和一个指针域,数据域存放用户需要的实际数据,指针域存放下一个结点的地址。从头指针head开始,head指向第一个结点,第一个结点指向下一个,直到最后一个结点。所有结点都是单线联系环环相扣。
(3)最后一个结点不再指向其他结点,称为表尾结点,它的指针域为空指针NULL,表示链表到此结束,指向表尾节点的指针称为尾指针。
(4)链表各结点之间的顺序关系由指针域来确定,并不要求逻辑上相邻的结点物理位置上也相邻,即链表依靠指针相连不需要占用一片连续的内存空间。
(5)随着数据处理量的增加,链表可以不受程序中变量定义的限制无限延长(仅受内存总量的限制)。再查入和删除操作中,只需修改相关节点指针域的链接关系,不需要像数组那样大量的改变数据实际存储位置,链表的使用可以使程序的内存利用率和时间效率大大提高。
单链表的建立:
单链表的建立就是在程序运行过程中,从无到有的建立一个链表,即一个一个分配节点的内存空间,然后输入结点中的数据,并建立结点间的相连关系。
eg:将一个班级的学生作为链表中的结点,然后将所有学生的信息存放到链表结构中。
首先,要创建结点结构,表示每一个学生。
struct student{
char cname[20];//姓名
int inumber://学号
struct student *next;//*next类型指向本结构体类型的指针类型
};

然后定义一个create函数,用来创建链表,该函数将会返回链表的头指针。int icount;
struct student *create(){
struct student *phead=NULL;//初始化链表,头指针为空
struct student *pend,*pnew;
icount=0;//初始化链表长度
pend=pnew=(struct student *)malloc(sizeof(struct student));
printf("please first enter name,then number");
scanf("%s",pnew->cname);
scanf("%d",&pnew->inumber);
while(pnew->inumber!=0){
icount++;
if(icount==1){
pnew->next=phead;//指针指向空
pend=pnew;//跟踪新结点
phead=pnew;//头指针指向首结点
}
else{
pnew->next=NULL;//新结点指针为空
pend->next=pnew;//原来的结点指向新结点
pend=pnew;//pend指向新结点
}
pnew=(struct student *)malloc(sizeof(struct student));//重新分配结点所占内存空间
scanf("%s",pnew->cname);
scanf("%d",&pnew->inumber);
}
free(pnew);//释放内存
return phead;
}

create函数的功能是创建链表,在create函数外使用了全局变量icount用来记录链表中结点的个数。在create函数中首先定义需要用到的指针变量:phead表示头指针,pnew表示新创建的结点,pend表示指向原来的尾结点。
然后用malloc函数分配内存,先用pend和pnew两个指针指向第一个分配的内存,然后分别输入第一个学生的姓名和学号,使用while语句进行判断,如果学号为0则结束循环。在while循环中,使用icount++操作表示链表结点个数的增加,next判断新加入的结点是否是第一次加入的结点,如果是执行if,不是执行else。
在if语句中,由于第一次加入的新结点即为首结点,也是最后一个结点,且新加入结点的指针应指向NULL(phead指向)。在else语句中,实现的是链表中已有结点时进行插入的操作。首先将新结点pnew的指针指向NULL,然后将原来最后一个结点的指针指向新结点,最后将pend指针指向最后一个结点(新结点)。
每个结点创建完后要再次分配内存,然后向其中输入数据,通过while语句进行判断输入的语句是否满足结点的要求,当节点不符合要求时,将终止循环,并用free函数将结点所占的内存释放。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值