程序写完之后运行正常就是在执行显示所有数据这个命令时直接结束程序了有点不理解,源码和图贴在下面了
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
typedef struct
{
int number;
char name[10];
int score;
}Student;
typedef struct LNode
{
Student data;
struct LNode* next;
}LNode, * LinkList;
Status Number()
{
int a;
while (TRUE)
{
while (scanf("%d", &a) != 1)
{
printf("输入错误请重新输入\n");
scanf("%*[^\n]");
scanf("%*c");
}
if (a >= 0)
return a;
printf("请重新输入\n");
}
return OK;
}
Status CreatListHead(LinkList L, int n)
{
LinkList p, q;
int i, k;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
q = L;
if (n == 0)
{
return OK;
}
printf("请按顺序输入学生的姓名、学号、成绩(每次以回车结束)\n");
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%s", p->data.name);
p->data.number = Number();
p->data.score = Number();
for (k = 0; k < i; k++)
{
if (q->data.number == p->data.number)
{
printf("有重复,请重新输入\n");
scanf("%s", p->data.name);
p->data.number = Number();
p->data.score = Number();
continue;
}
q = q->next;
}
p->next = L->next;
L->next = p;
q = L->next;
}
return OK;
}
Status GetAllElem(LinkList L)
{
if (!L)
{
printf("无数据\n");
return ERROR;
}
LinkList p;
p = L->next;
while (p != NULL)
{
printf("学号:%d 姓名:%s 成绩:%d\n", p->data.number, p->data.name, p->data.score);
p = p->next;
}
return OK;
}
Status ByName(LinkList L, char x[])
{
LinkList p;
p = L->next;
char a[10];
while (p != NULL)
{
if (strcmp(x, p->data.name) == 0)
{
printf("该学生的成绩为%d\n", p->data.score);
printf("该学生的学号为%d\n", p->data.number);
return OK;
}
p = p->next;
}
printf("不存在该学生\n");
printf("请重新输入(如退出则输入:8080)\n");
scanf("%s", a);
if (strcmp(a, "8080") == 0)
return OK;
ByName(L, a);
return ERROR;
}
Status BySpot(LinkList L, int x)
{
LinkList p;
int i = 1;
int a;
p = L->next;
while (p && i < x)
{
p = p->next;
i++;
}
if (!p || i > x)
{
printf("不存在\n");
printf("请重新输入(如退出则输入:8080)\n");
a = Number();
if (a == 8080)
return OK;
BySpot(L, a);
return ERROR;
}
printf("该学生学号为%d\n", p->data.number);
printf("该学生姓名为%s\n", p->data.name);
printf("该学生成绩为%d\n", p->data.score);
return OK;
}
Status ListInsert(LinkList L, int x)
{
int i = 0;
int a;
LinkList p, s, q;
p = L;
q = L->next;
while (p && i < x)
{
p = p->next;
i++;
}
if (!p || i > x)
{
printf("插入位置错误\n");
printf("请重新输入(如退出则输入:8080)\n");
a = Number();
if (a == 8080)
return OK;
ListInsert(L, a);
return ERROR;
}
s = (LinkList)malloc(sizeof(LNode));
printf("请按顺序输入学生的姓名、学号、成绩(每次以回车结束)\n");
while (TRUE)
{
scanf("%s", s->data.name);
s->data.number = Number();
s->data.score = Number();
while (q != NULL)
{
if (q->data.number == s->data.number)
{
printf("有重复,请重新输入\n");
scanf("%*[^\n]");
scanf("%*c");
break;
}
q = q->next;
while (q == NULL)
{
s->next = p->next;
p->next = s;
return OK;
}
}
}
}
Status ListDelete(LinkList L, int x)
{
int j, a;
LinkList p, q;
p = L;
j = 1;
while (p && j < x)
{
p = p->next;
j++;
}
if (!p || j > x)
{
printf("不存在\n");
printf("请重新输入(如退出则输入:8080)\n");
a = Number();
if (a == 8080)
return OK;
ListDelete(L, a);
return ERROR;
}
q = p->next;
p->next = q->next;
free(q);
return OK;
}
Status GetLength(LinkList L)
{
int i = 0;
LinkList p;
p = L->next;
if (!p)
{
printf("链表为空\n");
return OK;
}
while (p)
{
i++;
p = p->next;
}
printf("链表长度为%d\n", i);
return i;
}
int main()
{
LinkList L;
int n, k, d;
char a[10];
printf("请输入学生个数(以回车结束)\n");
n = Number();
CreatListHead(L, n);
printf("功能:\n");
printf("输入1:按顺序显示所有数据\n");
printf("输入2:输入姓名进行查找\n");
printf("输入3:输入位置进行查找\n");
printf("输入4:插入数据\n");
printf("输入5:输入位置进行删除\n");
printf("输入6:输入链表元素个数\n");
while (TRUE)
{
printf("请输入要执行什么功能\n");
d = Number();
switch (d)
{
case 1:
if (!L->next)
{
printf("无数据\n");
printf("\n");
break;
}GetAllElem(L);
printf("\n");
break;
case 2:
if (!L->next)
{
printf("无数据\n");
break;
}
printf("请输入要查找的姓名\n");
scanf("%s", a);
ByName(L, a);
printf("\n");
break;
case 3:
if (!L->next)
{
printf("无数据\n");
printf("\n");
break;
}
printf("请输入要查找第几个\n");
k = Number();
BySpot(L, k);
printf("\n");
break;
case 4:
printf("请输入要插入第几个的后面(要插入成第一个则输入0)\n");
if (L->next == NULL)
{
printf("无数据,插入第一个\n");
CreatListHead(L, 1);
break;
}
printf("请输入要插入第几个的后面(要插入成第一个则输入0)\n");
k = Number();
ListInsert(L, k);
printf("\n");
break;
case 5:
if (!L->next)
{
printf("无数据\n");
printf("\n");
break;
}
printf("请输入删除第几个\n");
k = Number();
ListDelete(L, k);
printf("\n");
break;
case 6:
GetLength(L);
printf("\n");
break;
default:
printf("不存在请重新输入\n");
}
}
return OK;
}