数据结构-链表代码详解(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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值