链表

链表

1.什么是链表

【官方版】链表是一种采用动态存储分配内存的数据结构。(数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合)
【自己】链表即让多个结构体通过指针串在一起成为一条链。即通过当前结构体(包含数据域与结构域)的指针域中存放的指针指向下一个结构体,即当前结构体的指针装着下一个结构体数据的地址。

2.为什么要用链表

一般用来存储数据用的是数组,但是在定义数组前需要预先知道有多少个数据要用来处理,要分配多大的数组。并且还要让所开辟的空间足够大用来满足自身需求,但如果分配的太多会浪费内存。因而链表可以用来弥补数组带来的诸多不便,让我们可以任意为一些数据进行空间的分配,根据需要进行动态内存单元的分配。
综上所述 :数组大小固定,不适合动态存储,动态添加,内存为一连续的地址,可随机访问,查询较快。而链表大小可变,扩展性强,在内存中其地址不连续,但只能顺着指针的方向查询,速度较慢。

3.创建链表
定义结构体
struct stud
{
 long num;
 char name[11];
 float score;
 struct stud* next;
};
创建链表
struct stud* create(void)   //链表的创建
{
 	struct stud *p1, *p2, *head;
 	head = p2 = (struct stud*)malloc(sizeof(struct stud));  //head,p2指向头结点
	printf("学号 姓名 成绩(学号输入-1结束\n");	
	p1 = (struct stud*)malloc(sizeof(struct stud));    //p1指向第一个结点 
	scanf("%ld %s %f", &p1->num, &p1->name, &p1->score);
	while(p1->num != -1)
 	{
  		p2->next = p1;           //将新结点链接到表尾 
 		p2 = p1;
 		p1 = (struct stud*)malloc(sizeof(struct stud));
  		scanf("%ld %s %f", &p1->num, &p1->name, &p1->score);
 }
	p2->next = NULL;
 	free(p1);
 	return head;
}
输出链表
void print(struct stud* p)   
{
	p = p->next;
	while(p != NULL)
	{
		printf(PT);
		p = p->next;
 	}
}
struct stud* Insert(struct stud* p0)
{
 	struct stud* p;
 	p = (struct stud*)malloc(sizeof(struct stud));  //p指向新申请的结点 
 	printf("请输入要插入的学号 姓名 成绩\n");
 	scanf("%ld %s %f", &p->num, p->name, &p->score);
 	while(p0->next != NULL && p0->next->num == p->num) //找到重号
 	{
  		free(p);
  		return 0;
 	}
 	p->next = p0->next;  //后续链表接到新链表上 
 	p0->next = p;   //新链表接到前链表后 
 	return p0;
}
struct stud* Delete(struct stud* p0)
{	
	long num;
	struct stud* p;
 	p = p0->next;
 	if(p == NULL)
  		return 0;
 	printf("请输入要删除的学号:");
 	scanf("%ld", &num);
 	while(p != NULL)
 	{
  		if(p->num == num)    //寻找要删除的结点 
  		{
   			p0->next = p->next;   //后续结点链接到前一个结点上 
   			free(p);
   			return p0;     //删除成功 
  		}
  	p0 = p;
  	p = p->next;
 	}
 	return p0;       //如果没有要查找的学号则删除失败返回0 
}
struct stud* change(struct stud* p)
{
 	int i, n, count;
 	struct stud* now;
 	now = p;
 	printf("请输入要修改第几个学生的信息:\n");
 	scanf("%d", &n);
 	for(i = 1; i <= count && now != NULL; i++)
 	{
  		if(i == n)
  		{
   			printf("请输入修改后的成绩:\n");
   			scanf("%d", &now->score);
   			return p;
  		}
  	now = now->next;
 	}
}
struct stud* find(struct stud* p)
{
 	long num;
 	printf("请输入要查找的学号:\n");
 	scanf("%ld", &num);
 	while(p->next != NULL)
	{
  		p = p->next;
  		if(p->num == num)
  	 	return p;
 	}
 	return NULL;
}

主函数

int main()
{
 	struct stud *head, *p;
 	head = create();
 	print(head);
 	p = find(head);
 	if(p)
  		printf("找到学号:%ld 姓名:%-10s 成绩:%6.lf\n", p->num, p->name, p->score);
 	else
  		printf("没有此信息!\n");
 	if(Insert(head))
  		printf("已成功插入!\n");
 	else
  		printf("有重号插入失败\n");
 	print(head);
 	if(Delete(head))
  		printf("已正确删除!\n");
 	else
  		printf("要删除的信息不存在!\n");
 	print(head);
 } 

注:此代码中:#define PT “学号:%ld 姓名:%-10s 成绩:%6.lf\n”, p->num, p->name, p->score

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值