C语言单链表的创建、输出、插入结点、删除结点

原创 2018年04月17日 17:41:27

链表对于C语言的学习者来说是一大难点,但链表又是学好数据结构的基础。在此,对单链表的创建、输出、结点的插入、结点的删除进行简要介绍。

1、首先定义一个结构体数组

#define LEN sizeof(struct student)
struct student
{
	int num;
	char name[20];
	float score;
	struct student *next;
};
int n;

2、单链表的创建

 

struct student *creat(void)//创建链表 
{
	n=0;
	struct student *p1,*p2,*head;
	head=NULL;
	p1=p2=(struct student *)malloc(LEN);//开辟新单元
	scanf("%d,%s,%f",&p1->num,&p1->name,p1->score);//输入数据
	while(p1->num!=0)//限定当num为0时,链表输入结束
	{
		n++;
		if(n==1)head=p1;
		else
		p2->next=p1;
		p2=p1;
		p1=(struct student *)malloc(LEN);
	    scanf("%d,%s,%f",&p1->num,&p1->name,p1->score);
	 } 
	 p2->next=NULL;
	 return head;
}
3、单链表的输出

     

void print(struct student *head)//输出链表 
{
	printf("\nthere are %d records\n",n);
	struct student *p;
	p=head;
	if(head!=NULL)
		do
		{
			printf("%d,%s,%.0f\n",p->num,p->name,p->score);
			p=p->next;
			
		}
		while(p!=NULL);
}

4、单链表结点删除

struct student *del(struct student *head,int num)//删除一个节点 
{
	struct student *p,*p1;
	p=head;
	if(head==NULL)//当链表为空时
	{
		printf("this table is null\n");
		goto end;
	}
	while(num!=p->num&&p->next!=NULL)//判断链表中是否存在该结点
	{
		p1=p;
		p=p->next;
	}
	if(num==p->num)//当结点存在时
	{
		if(p==head)head=p->next;
		else
		p1->next=p->next;
		printf("delete\n");
		n--;//链表中结点个数
	}
	else
	printf("not find");//找不到该结点时
end: return head;
}

5、单链表的插入

struct student *insert(struct student *head,struct student *stud)//插入一个节点 
{
	struct student *p0,*p1,*p2;
	p1=head;
	p0=stud;
	if(head==NULL)
	{
		head=p0;
		p0->next=NULL;
	}
	else
	{
		while((p0->num>p1->num)&&(p1->next!=NULL))//判断链表位置
		{
			p2=p1;
			p1=p1->next;
		}
		if(p0->num<=p1->num)
		{
			if(head==p1)head=p0;
			else p2->next=p0;
			     p0->next=p1;
		}
		else
		{
			p1->next=p0;
			p0->next=NULL;
		}	
	}
	n++;
	return(head);
 } 

6、main主函数

int main(int argc, char *argv[]) {
struct student *head,*stu;
int del_num;
printf("input record:\n");//创建链表
head=creat();
print(head);//输出链表
printf("input the deleted number:\n");//删除链表
scanf("%d",&del_num);//输入要删除的记录
while(del_num!=0)
{
	head=del(head,del_num);
	print(head);
    printf("input the deleted number:\n"); 
    scanf("%d",&del_num); 
}
printf("input the inserted record:\n");//插入结点
stu=(struct student *)malloc(LEN);
scanf("%d,%s,%f",&stu->num,&stu->name,&stu->score);
while(stu->num!=0)
{
	head=insert(head,stu);
	print(head);
	printf("input the inserted record:\n");
    stu=(struct student *)malloc(LEN);
    scanf("%d,%s,%f",&stu->num,&stu->name,&stu->score);
}
}
注:内容来源于谭浩强C语言第二版内容,做了小幅度改正

C语言系列之 链表与相关操作

清华大学尹成老师、微软全球最具价值专家,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!
  • 2015年06月26日 11:26

学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表

用c语言实现单向无环链表的创建、插入、删除、打印、逆序的基本操作。
  • xucongjiang
  • xucongjiang
  • 2010-10-25 16:34:00
  • 7270

C语言实现链表节点的插入和删除

/* 链表节点的插入与删除 编译环境:VC++ 6.0 编译系统:windows XP SP3 */ #include #include #...
  • Jamie321
  • Jamie321
  • 2016-08-30 15:22:32
  • 5530

单链表插入和删除结点c语言的实现

个人学习的一些笔记,如果有误,希望指正
  • mango_haoming
  • mango_haoming
  • 2017-03-10 11:22:07
  • 3706

【C语言】 链表 单链的建立,节点增加 删除 顺序插入

上一篇的升级版 #include #include struct bookdata{ int book; struct bookdata *next; };  /* 打印链表 */  ...
  • hqweay
  • hqweay
  • 2016-11-12 18:53:35
  • 968

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)...
  • xiaofeige567
  • xiaofeige567
  • 2014-05-29 08:54:47
  • 15610

学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表

链表是最简单的一种数据结构,是每个软件开发者必须掌握的,也是企业招聘时最常考的内容,因此,在这里总结一下单链表的一些基本操作。 注:这里是单向无环链表,头结点中存放了数据,换句话说就是头结点和其他结...
  • aidem_brown
  • aidem_brown
  • 2013-12-04 11:03:11
  • 568

链表的基本操作(C语言版):建立,插入,删除,查找,输出

//1、链表的基本操作(不带头结点)//**的含义把握不准确,要认真研究练习 #include #include typedef struct list { int data; struc...
  • xiaohuizi2009
  • xiaohuizi2009
  • 2013-03-04 12:44:45
  • 6227

C语言及程序设计进阶例程-18 链表中结点的插入和删除

贺老师教学链接  C语言及程序设计进阶 本课讲解回顾:动态分配和撤销内存#include #include struct Student { int num; float scor...
  • sxhelijian
  • sxhelijian
  • 2015-05-30 21:25:59
  • 1875

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客《C语言实现单链表节点的删除(不带头结点)》中详细实现了如何在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表。代码示例上传至 https://github...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016-03-01 16:09:57
  • 4208
收藏助手
不良信息举报
您举报文章:C语言单链表的创建、输出、插入结点、删除结点
举报原因:
原因补充:

(最多只允许输入30个字)