首先头文件
#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);
}