#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define T 1
#define F -1
typedef int Status;
struct Student {
int id;
char name[20];
float grade;
};
typedef struct Dlist {
Student data;
struct Dlist* next;
}Dlist,*Zdlist;
//创建
Status Cj_List(Zdlist& L) {
L = (Zdlist)malloc(sizeof(Student));
if (L) {
L->next = NULL;
printf("创建成功!\n");
return OK;
}
printf("创建失败!\a\n");
return ERROR;
}
//插入
Status Cr_List(Zdlist &L ,int i,Student e) {
Zdlist p ,s;
p = L;
int j = 0; //判断是否有头结点,无头节点则创建失败。
while (p && (j < i - 1)) {
p = p->next;
++j;
}
if (!p || j > i - 1) {
printf("插入失败!\a\n");
return ERROR;
}
s = (Zdlist)malloc(sizeof(Student));//插入时先新建头结点
s->next = NULL; //定义p=L用p代替L进行指针遍历,防止丢失头结点
s->data = e;
s->next = p->next;
p->next = s;
printf("插入成功!\n");
return OK;
}
//查找
Status Cz_List(Zdlist L, Student e) {
Zdlist p ;
int i = 1;
p = L->next;
while (p && strcmp(p->data.name, e.name) != 0) { // 比较名字字符
p = p->next;
i++;
}
if (p) {
printf("学生数据在第 %d 位\n", i);
return OK;
}
printf("未找到该学生!\a\n");
return ERROR;
}
//取值
Status Qz_List(Zdlist L, int i) { //找到位置直接输出学生信息
Zdlist p = L;
int j = 0;
while (p && (j < i )) {
p = p->next;
++j;
}
if (!p || (j > i )) {
printf("取值位置不合理!\a\n");
return ERROR;
}printf("该学生信息为:学号:%d 姓名:%s 成绩:%.2f\n", p->data.id, p->data.name, p->data.grade);
return OK;
}
//删除
Status Sch_List(Zdlist& L, int i) {
Zdlist p = L;
int j = 0;
while ((p->next) && (j < i - 1)) {
p = p->next;
++j;
}
if (!(p->next) || (j > i - 1)) {
printf("删除的位置不合理!\a\n");
return ERROR;
}
Zdlist q = (Zdlist)malloc(sizeof(Student));
Dlist* temp = q;
q = p->next;
p->next = q->next;
free (temp); //使指针指向删除节点的下一个节点,用free将删除节点内存释放
temp->next = NULL;
printf("删除成功!\n");
return OK;
}
//输出
Status Sc_List(Zdlist L) {
Zdlist p = L;
int sum=0;
if (!p->next) {
printf("链表为空!\a\n");
return ERROR;
}
printf("全部学生数据:\n");
while (p->next!=NULL) {
p = p->next;
sum++; //输出总人数
printf("学号:%d 姓名:%s 成绩:%.2f\n学生总数量:%d个\n", p->data.id, p->data.name, p->data.grade,sum);
}
return OK;
}
//清空
Status Qk_List(Zdlist& L,int open) {
if (open != T) {
printf("内存未被创建!\a\n");
return ERROR;
}
while (L->next!=NULL) { //调用删除函数遍历清空链表所有元素及释放内存
Sch_List(L, 1);
}
L = NULL;
printf("清楚数据完成!\n内存已清空\n");
return OK;
}
int main() {
Zdlist L;
Student e;
int choose;
int i;
int open = F; //判断内存是否已经创建,防止键盘非法输入造成遍历越界报错异常
while (1) {
printf("*******************************\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("请选择操作:");
scanf("%d", &choose);
printf("\n");
switch (choose) {
case 1:
if (open != F) {
printf("请勿重复创建!\a\n");
break;
}
Cj_List(L);
open = T; //open=T 已申请内存 open=F 内存未被申请
break;
case 2:
if (open != T) {
printf("内存未被创建!\a\n");
break;
}
printf("输入插入的位置、学号、姓名、成绩(空格隔开)\n");
scanf("%d %d %s %f", &i, &e.id, &e.name,&e.grade);
Cr_List(L, i, e);
break;
case 3:
if (open != T) {
printf("内存未被创建!\a\n");
break;
}
printf("输入需查找学生的姓名:");
scanf("%s", e.name);
printf("\n");
Cz_List(L, e);
break;
case 4:
if (open != T) {
printf("内存未被创建!\a\n");
break;
}
printf("输入提取的位置\n");
scanf("%d", &i);
Qz_List(L, i);
break;
case 5:
if (open != T) {
printf("内存未被创建!\a\n");
break;
}
printf("输入删除的位置\n");
scanf("%d", &i);
Sch_List(L, i);
break;
case 6:
if (open != T) {
printf("内存未被创建!\a\n");
break;
}
Sc_List(L);
break;
case 7:
Qk_List(L,open);
open = F;
break;
case 8:
printf("已成功退出!\n");
system("pause");
return 0;
}
}
}
————————————————
版权声明:本文为CSDN博主「基础不扎实的计算机小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_55797565/article/details/120975844