数据结构-链表代码详解(C语言)

首先头文件

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include<string.h>//strcmp(字符串1,字符串2)若相等返回0,大于返回1,小于返回-1  strcpy(目标位置, 原字符串)--此函数将含有\0结尾的字符串复制到另一个地址空间,返回值为char*
#include<stdlib.h>//引用malloc  free(要释放的变量)--将内存释放   exit(-1)--此函数作用于非void型终结程序,1/-1为异常退出,0为正常退出
typedef struct{
	char num[8];//专业---数据域
	char name[8];//姓名---数据域
	int chenji;//成绩---数据域
}elemtype;
typedef struct sur {
	elemtype data;//数据域
	struct sur *next;//指针域
}lnode;

函数的声明

void caidan();//菜单
lnode* jiedian(elemtype x);//建立新结点
void toucha(lnode** L, elemtype x);//头插法(用二级指针)
void weicha(lnode** L, elemtype x);//尾插法
void shuru(lnode** L);//输入内容
void dayin(lnode* L);//打印链表
void xiugai(lnode** L);//指定位置修改学生信息
void toushan(lnode** L);//头删数据
void weishan(lnode** L);//尾删数据
void charen(lnode* L);//查找人
void qingkong(lnode** L);//清空链表
void jiaohuan(lnode* L);//交换前后位置
void zhengxu(lnode** L);//给年龄进行排序
void buhege(lnode* L);//成绩不合格的人数
int len(lnode* L);//链表长度

主函数

int main() {
	lnode* L = NULL;//创建链表
	do {
		caidan();
		printf("请输入:\n");
		int m;
		scanf("%d", &m);
		switch (m) {
		case 0: printf("退出\n");
			return;
		case 1:shuru(&L);
			break;
		case 2:dayin(L);
			break;
		case 3:xiugai(&L);
			break;
		case 4:toushan(&L);
			break;
		case 5:weishan(&L);
			break;
		case 6:charen(L);
			break;
		case 7:qingkong(&L);
			break;
		case 8:jiaohuan(L);
			break;
		case 9:zhengxu(&L);
			break;
		case 10:buhege(L);
			break;
		}
	} while (1);
	

	return 0;
}

具体函数实现

//菜单
void caidan() {
	printf("-------------------------------------\n");
	printf("&&&&&&&&& 0 - 退出                  &\n");
	printf("&&&&&&&&& 1 - 输入内容              &\n");
	printf("&&&&&&&&& 2 - 打印链表              &\n");
	printf("&&&&&&&&& 3 - 指定位置修改学生信息  &\n");
	printf("&&&&&&&&& 4 - 头删数据              &\n");
	printf("&&&&&&&&& 5 - 尾删数据              &\n");
	printf("&&&&&&&&& 6 - 查找人                &\n");
	printf("&&&&&&&&& 7 - 清空链表              &\n");
	printf("&&&&&&&&& 8 - 交换前后位置          &\n");
	printf("&&&&&&&&& 9 - 给年龄进行排序        &\n");
	printf("&&&&&&&&& 10 - 成绩不合格的人数     &\n");
	printf("-------------------------------------\n");
}

//输入内容
void shuru(lnode** L) {
	printf("输入学生个数\n");
	int a=0;
	scanf("%d", &a);
	for (int i = 0; i < a; i++) {
		elemtype x;
		printf("输入学生 专业 姓名 年龄 并以空格隔开\n");
		scanf("%s %s %d", x.num, x.name, &x.chenji);
		if(x.chenji>=0 && x.chenji<=100){
			jiedian(x);
			weicha(L, x);
		}
		else {
			printf("成绩错误,请重新输入\n");
			i--;
		}
	}
}

//建立新结点
lnode* jiedian(elemtype x) {
	lnode* q = (lnode*)malloc(sizeof(lnode));
	if (q == NULL) {
		printf("malloc失败\n");
		exit(-1);//此函数作用于非void型终结程序,1/-1为异常退出,0为正常退出
	}
	strcpy(q->data.num, x.num);//此函数将含有\0结尾的字符串复制到另一个地址空间,返回值为char*
	strcpy(q->data.name, x.name);
	q->data.chenji=x.chenji;
	q->next = NULL;
	return q;
}
//头插法(用二级指针)
void toucha(lnode** L, elemtype x) {
	//建立新结点
	lnode* q = jiedian(x);
	//头插数据
	q->next = *L;
	*L = q;
	printf("头插成功\n");
}
//尾插法
void weicha(lnode** L, elemtype x) {
	lnode* q = jiedian(x);
	if (*L == NULL) {
		*L = q;//若本来头节点地址为空,则直接指向新增节点
	}
	else {
		lnode* p = *L;//临时变量用于从头文件开始进行遍历
		while (p->next != NULL) {//遇到空地址时停止
			p = p->next;
		}
		p->next = q;//将空地址指向新增节点
		printf("尾插成功\n");
	}
}
//打印链表
void dayin(lnode* L) {
	lnode* p = L;
	if (L == NULL) {
		printf("链表为空\n");
		return;
	}
	while (p != NULL) {
		printf("%s %s %d\n", p->data.num,p->data.name,p->data.chenji);
		p = p->next;
	}
	printf("NULL\n");
}
//头删数据
void toushan(lnode** L) {
	if ((*L) == NULL) {
		printf("链表为空\n");
		return;
	}
	lnode* p = (*L)->next;
	(*L)->data = p->data;
	*L = p;
	printf("头删成功\n");
}
//尾删数据
void weishan(lnode** L) {
	if ((*L) == NULL) {
		printf("链表为空\n");
		return;
	}
	lnode* p=*L;
	lnode* d;
	while (1) {
		d = p;
		p = p->next;
		if (p->next == NULL) {
			d->next = NULL;
			printf("尾删成功\n");
			return;
		}
	}
}
//指定位置修改学生信息
void xiugai(lnode** L){
	printf("输入修改位置:\n");
	int a;
	scanf("%d", &a);
	if (a <= 0||a>len(*L)) {
		printf("位置非法\n");
		return;
	}
	lnode* p = *L;
	while (a > 1) {
		p = p->next;
		a--;
	}
	printf("输入新数据\n");
	scanf("%s %s %d", p->data.num, p->data.name, &p->data.chenji);
	printf("修改成功\n");
}

//查找人
void charen(lnode* L) {
	char a[8]="0";
	printf("请输入要查找人姓名:\n");
	scanf("%s", &a);
	int n = 1;
	lnode* p = L;
	while (strcmp(p->data.name, a) != 0) {
		if (p == NULL) {
			printf("没查找到\n");
			return;
		}
		p = p->next;
		n++;
	}
	printf("此人为第%d号\n此人信息为:%s %s %d\n", n, p->data.num, p->data.name, p->data.chenji);
}
//清空链表
void qingkong(lnode** L) {
	lnode* p = *L;
	while (p) {
		lnode* num = p->next;
		free(p);
		p = num;
	}
	*L = NULL;
	printf("链表已被销毁\n");
}
//交换前后位置
void jiaohuan(lnode* L) {
	lnode* p = L;
	printf("请输入要交换的位置\n");
	int a;
	scanf("%d", &a);
	if (a <= 0 && a >= len(L)) {
		printf("位置非法\n");
		return;
	}
	while (a > 1) {
		p = p->next;
		a--;
	}
	elemtype q;
	//交换第一个元素
	strcpy(q.num, p->next->data.num);
	strcpy(p->next->data.num, p->data.num);
	strcpy(p->data.num, q.num);
	//交换第二个元素
	strcpy(q.name, p->next->data.name);
	strcpy(p->next->data.name, p->data.name);
	strcpy(p->data.name, q.name);
	//交换第三个元素
	q.chenji= p->next->data.chenji;
	p->next->data.chenji = p->data.chenji;
	p->data.chenji = q.chenji;
	printf("交换成功\n");
}
//计算链表长度
int len(lnode* L) {
	int a = 0;
	lnode* p = L;
	while (p != NULL) {
		p = p->next;
		a++;
	}
	return a;
}
//给年龄进行排序
void zhengxu(lnode** L) {
	lnode* p = *L;
	for (int i = len(p); i>0; i--) {
		lnode* p = *L;
		for (int j = 1; j < i; j++) {
			if (p->data.chenji < p->next->data.chenji) {
				jiaohuan(*L, j);
			}
			if(j!=i-1)
				p = p->next;
		}
	}
}
//成绩不合格的人数
void buhege(lnode* L) {
	int a = 0;
	lnode* p = L;
	if (p == NULL) {
		printf("链表为空\n");
		return;
	}
	for (int i = 0; i < len(L); i++) {
		if (p->data.chenji < 60) {
			a++;
		}
		p = p->next;
	}
	printf("有%d人成绩不合格\n", a);
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构》(c语言版) 是由严蔚敏等人编著的一本关于数据结构的教材。该书主要介绍了各种数据结构,如线性表、链表、栈、队列、树、图等,并针对每种数据结构详细介绍了其定义、基本操作以及应用。同时,书中还提供了丰富的习题和考研真题,供学生练习巩固所学知识。 该书的第一部分是对数据结构基础的介绍,包括算法分析与设计、线性表、栈和队列等。其中,算法分析与设计部分主要讨论了算法的时间复杂度和空间复杂度分析方法,为后续章节奠定了基础。线性表部分介绍了顺序表和链表的定义、基本操作以及应用,而栈和队列部分则详细介绍了栈和队列的定义、基本操作以及常见应用。 第二部分主要介绍了树和二叉树,包括二叉树的定义、二叉树的遍历、树的存储结构和线索二叉树等。此外,还介绍了树的应用,如赫夫曼树和二叉排序树,以及B树和B+树等高级树结构。 第三部分则介绍了图的基本概念、图的存储结构以及图的遍历算法。此外,还讨论了最小生成树和最短路径等重要算法。 该书尤其重视习题的设计,每章都设置了大量的习题,包括填空题、选择题和编程题等,旨在帮助学生巩固所学知识并提升解决实际问题的能力。此外,书中还附有考研真题和详细解析,为考研学生提供实战练习的机会。 总而言之,严蔚敏《数据结构》(c语言版) 笔记和习题(含考研真题)详解数据结构的基础知识讲解得深入浅出,习题设计丰富,适合作为数据结构教材或考研复习资料使用。通过学习该书,读者可以建立起扎实的数据结构知识基础,并熟练掌握各种数据结构的应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值