链表是一群结构体(称为结点)通过指针连起来。这种结构体类型,比较特殊,叫自引用结构体类型。它有一个指针指向和和结构体一样的类型,其余是数据成员。

头指针指向第一结点,尾指针一定要用空表示,这叫有头有尾。一般在表头加头结点,之后才是正式含数据的结点。

这些结点通过头指针访问,所以若头指针值为空,那么链表就为空。所以头指针是最重要的,一般一定会给函数传递头指针。

//-------------------------------------
//--- linked list.1
//--- 使用链表管理学生信息
//-------------------------------------
#include <stdio.h>
#include <stdlib.h> struct student
{
long no;
char name[20];
char addr[30];
struct student *next;
}; typedef struct student LIST;
LIST *CreateList();
void DispList(LIST *h);
void input(LIST *p);
LIST *DeleteNode(LIST *h, long no);
LIST *InsertNode(LIST *h, LIST *s); int main(int argc, char const *argv[])
{
LIST *head,*p;
long no;
int choice,confirm;
head=CreateList(); //创建链表,返回头指针
DispList(head); //输出链表内信息
while(1)
{
printf("0--Insert\n1--Delete\n2--Quit\nPlease select:");
scanf("%d",&choice);
if(choice==2)
break;
printf("your just select %d,yes? ",choice);
scanf("%d",&confirm);
if(confirm){
switch(choice)
{
case 0:
printf("OK,now we insert a record!\n");
printf("======Insert=====\n");
p=(LIST *)malloc(sizeof(LIST));
if(p == NULL)
{
printf("Wrong!\n");
exit(0);
}
input(p);
head=InsertNode(head,p);
DispList(head);
break;
case 1:
printf("OK,now we delete a record!\n");
printf("======Delete=====\n");
printf("Delete Id:");
scanf("%d",&no);
head=DeleteNode(head,no);
if (head!=NULL)
DispList(head);
else printf("All records have been deleted!\n");
break;
}
}
}
return 0;
}
void input(LIST *p)
{
LIST *cur=p;
printf("Id:");
scanf("%d", &cur->no);
printf("Name:");
scanf("%s", &cur->name);
printf("Address:");
scanf("%s", &cur->addr);
}
LIST *CreateList()/*返回头指针,故定义为结构体指针函数。*/
/*创建链表的函数定义*/
{
LIST *h, *prev, *cur;//这三不是结构体,是工作指针,用来操作的。
int i, n;
h=NULL;
/*第一个结点过来孤零零的,不知道干啥,所以得弄个头指针。初始化为空。*/
printf("Input numbers of records:");
scanf("%d",&n); for (int i = 0; i < n; i++)//for循环创建链表
{
cur=(LIST *)malloc(sizeof(LIST));/*LIST型指针,动态生成一个结点空间,返回首地址*/
if(cur == NULL)
{
printf("Wrong!\n");
exit(0);
}
cur->next=NULL;/*将cur的next置为NULL*/
if (h==NULL)/*如果h=NULL,表示当前在处理第一个结点*/
{
h=cur;/*令h指向第一个结点*/
}
else
prev->next=cur;
/*令表中最后一个结点的next指向cur;prev负责将链段尾结点和新结点连起来*/
/*关于指针指来指去,想想就好了,实际上指针都是地址,内存条里是不会有箭头的。要懂链表,先理解结构体。结构体变量可以通过变量名.成员名的方式访问成员,也可以用存储了结构体首地址的指针变量->成员名的形式访问成员。这里cur存储了新来的结构体的首地址,prev存储了链段尾结构体的首地址,你不妨将指针直接看成结构体,没什么不妥。那么让尾结构体的指针成员next存储新来的结构体的首地址,这样,通过链段尾结构体就可以访问新来的结构体的了,事实上只能这样访问,别无它法。正因为如此,一个结构体带一个结构体,才起名为链表。
通过prev->next就可以操作指针成员next。prev->next=cur执行后,prev就存储了新来结构体的首地址。由于新来的结构体已经安顿好了,它其实已经作为老结构体了,那么prev就存储了这个老结构体的首地址,你可以把prev看成这个老结构体。
*/
//input information
printf("=====第%d人=====\n",i+1);
input(cur); prev=cur;/*将prev指向最后一个结点;prev永远指向链段的最后一个结点*/
}
return h;
} void DispList(LIST *h)
{
LIST *p=h;
int i=0;
while(p!=NULL)
{
if(i==0)
{
printf("学号\t姓名\t地址\n");//只显示一次
i=1;
}
printf("%d\t%s\t%s\n",p->no, p->name, p->addr);
p=p->next;
}
} LIST *InsertNode(LIST *h, LIST *s)
{
LIST *pre, *p;
p=h;
if (h==NULL)
{
h=s;
s->next=NULL;
}else{
while((s->no > p->no) && (p->next!=NULL))
{
pre=p;
p=p->next;
}
if(s->no <= p->no){
if (h==p){
s->next=h;
h=s;
}else{
pre->next=s;
s->next=p;
}
}else{
p->next=s;
s->next=NULL;
}
}
return h;
} LIST *DeleteNode(LIST *h, long no)
{
LIST *pre, *p;
if (h==NULL)
{
printf("链表为空,不能删除结点!\n");
return NULL;
}
p=h;
while((p->no != no) && p->next!=NULL)
{
pre=p;
p=p->next;
}
if (p->no==no)
{
if (p==h)
h=p->next;
else pre->next=p->next;
free(p);
printf("结点成功删除\n");
}else printf("There isn't Id:%d.\n",no);
return h;
}

C语言语法教程-链表的更多相关文章

  1. C语言语法教程-结构体

    2018-09-30 结构体中成员变量地址是连续的,结构体用于描述记录. Create a struct //---------------------------- //struct1.c //创建 ...

  2. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  3. 《JavaScript语言入门教程》记录整理:运算符、语法和标准库

    目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...

  4. 学习Nim语言.rar(nim语言中文教程下载)

    学习Nim语言 nim 语法上类似python ,是一门静态编译型语言,nim 使用空格缩进标示语句块的开始和结束, 喜欢python风格的程序员应该也会很容易适应和喜欢nim的风格. nim语言官方 ...

  5. 「C语言」单链表/双向链表的建立/遍历/插入/删除

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  6. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  7. C语言入门教程-(5)格式化输入输出

    1.输入和输出 在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出.在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出. 2.格式化输出— ...

  8. 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

    1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

  9. Go语言语法说明

    Go语言语法说明 go语言中的go func(){}() 表示以并发的方式调用匿名函数func 深入讲解Go语言中函数new与make的使用和区别 前言 本文主要给大家介绍了Go语言中函数new与ma ...

随机推荐

  1. LeetCode——Employees Earning More Than Their Managers

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...

  2. linux时间校对

    在虚拟机中查看安装的linux时间,总是不对,于是查阅资料,有很多解决办法,我个人比较倾向于用ntpdate的方式更新时间. 感觉比较好用的一个方法: 输入date查看时间,发现不对,相差甚远!(当前 ...

  3. 关于VS2015 发布.net mvc 网站失败的问题

    问题:VS生成成功,发布失败,在“正在连接到***文件夹”处就不能继续了.. 项目开发告一段落,准备部署到服务器上进行最后测试,但是始终发布失败  生成成功,发布失败,没有任何提示信息 一开始以为是文 ...

  4. Linux(CentOS)上,安装了Apache(httpd)后,其他的电脑无法访问的原因

    今天试了下在虚拟机上利用CentOS系统的yum命令安装好了httpd(apache2.2),然后在windows系统下访问此虚拟机的ip地址,却访问不了. 因为前段时间有知道过iptable的限制, ...

  5. 201871010108-高文利《面向对象程序设计(java)》第十周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...

  6. chrony软件

    chrony简介 Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成:chronyd和chronyc. chronyd是一个后台运行的守护 ...

  7. 海量数据MySQL项目实战

    主要内容包含 MySQL 典型数据库架构介绍.MySQL 主流数据库架构对比等理论性知识,然后从“订单.用户”两个项目实战,抛砖引玉,介绍亿级互联网业务数据库项目如何设计. MySQL 典型数据库架构 ...

  8. CPU-bound(计算密集型) 和I/O bound(I/O密集型)/数据密集型

    https://blog.csdn.net/q_l_s/article/details/51538039 I/O密集型 (CPU-bound)I/O bound 指的是系统的CPU效能相对硬盘/内存的 ...

  9. onchange onpropertychange 和 oninput 事件的区别

    onchange 事件在内容改变(两次内容有可能还是相等的)且失去焦点时触发. onpropertychange 事件却是实时触发,即每增加或删除一个字符就会触发,通过 js 改变也会触发该事件,但是 ...

  10. apktool android studio 调试 smali code, 重新打包

    虽然有些菜单的位置跟新版的Android Stuido 3.4 有些不同,但是能用. https://crosp.net/blog/software-development/mobile/androi ...