(日后写批注)定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
顺序表
#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
{
Student data[MAXSIZE];
int length;
}SqList;
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 Creat(SqList* L, int x)
{
int i, e, w = 0;
printf("请按顺序输入学生的姓名、学号、成绩(每次以回车结束)\n");
for (i = 0; i < x; i++)
{
scanf("%s", L->data[i].name);
L->data[i].number = Number();
L->data[i].score = Number();
for (e = 0; e <= L->length; e++)
{
if (L->data[i].number == L->data[e].number)
{
w++;
}
}
if (w != 1)
{
printf("有重复,请重新输入学号\n");
L->data[i].number = Number();
}
L->length++;
}
return OK;
}
Status GetAllElem(SqList* L)
{
int i = 0;
if (L->length == 0)
{
printf("无数据\n");
return OK;
}
for (i; i < L->length; i++)
{
printf("学号:%d 姓名:%s 成绩:%d\n", L->data[i].number, L->data[i].name, L->data[i].score);
}
return OK;
}
Status ByName(SqList* L, char x[])
{
int i = 0;
char a[10];
for (i; i < L->length; i++)
{
if (strcmp(x, L->data[i].name) == 0)
{
printf("该学生的成绩为%d\n", L->data[i].score);
printf("该学生的学号为%d\n", L->data[i].number);
return OK;
}
i++;
}
printf("不存在该学生\n");
printf("请重新输入(如退出则输入:8080)\n");
scanf("%s", a);
if (strcmp(a, "8080") == 0)
return OK;
ByName(L, a);
return ERROR;
}
Status BySpot(SqList* L, int x)
{
int a;
if (x < 1 || x > L->length)
{
printf("不存在\n");
printf("请重新输入(如退出则输入:8080)\n");
a = Number();
if (a == 8080)
return OK;
BySpot(L, a);
return ERROR;
}
printf("该学生学号为%d\n", L->data[x - 1].number);
printf("该学生姓名为%s\n", L->data[x - 1].name);
printf("该学生成绩为%d\n", L->data[x - 1].score);
return OK;
}
Status ListInsert(SqList* L, int i)
{
int k, p, e, w = 0;
if (L->length == MAXSIZE)
{
printf("顺序表已满\n");
return ERROR;
}
if (i < 0 || i > L->length)
{
printf("不在范围\n");
printf("请重新输入(如退出则输入:8080)\n");
p = Number();
if (p == 8080)
return OK;
ListInsert(L, p);
return ERROR;
}
for (k = L->length - 1; k >= i; k--)
L->data[k + 1] = L->data[k];
printf("请按顺序输入学生的姓名、学号、成绩(每次以回车结束)\n");
scanf("%s", L->data[i].name);
L->data[i].number = Number();
L->data[i].score = Number();
for (e = 0; e <= L->length; e++)
{
if (L->data[i].number == L->data[e].number)
{
w++;
}
}
if (w != 1)
{
printf("有重复,请重新输入\n");
ListInsert(L, i);
return OK;
}
L->length++;
return OK;
}
Status ListDelete(SqList* L, int i)
{
int k;
int a;
if (i < 1 || i > L->length)
{
printf("输入错误\n");
printf("请重新输入(如退出则输入:8080)\n");
a = Number();
if (a == 8080)
return OK;
ListDelete(L, a);
return ERROR;
}
for (k = i - 1; k <= L->length - 1; k++)
{
L->data[k] = L->data[k + 1];
}
L->length--;
return OK;
}
int main()
{
int d, x, k;
char a[10];
SqList L;
L.length = 0;
printf("请输入学生个数(以回车结束)\n");
x = Number();
Creat(&L, x);
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:
GetAllElem(&L);
printf("\n");
break;
case 2:
if (L.length == 0)
{
printf("无数据\n");
break;
}
printf("请输入要查找的姓名\n");
scanf("%s", a);
ByName(&L, a);
printf("\n");
break;
case 3:
if (L.length == 0)
{
printf("无数据\n");
break;
}
printf("请输入要查找第几个\n");
k = Number();
BySpot(&L, k);
printf("\n");
break;
case 4:
printf("请输入要插入第几个的后面(要插入成第一个则输入0)\n");
k = Number();
ListInsert(&L, k);
printf("\n");
break;
case 5:
if (L.length == 0)
{
printf("无数据\n");
break;
}
printf("请输入删除第几个\n");
k = Number();
ListDelete(&L, k);
printf("\n");
break;
case 6:
printf("顺序表的长度为%d\n", L.length);
printf("\n");
break;
default:
printf("不存在请重新输入\n");
}
}
return OK;
}
链表
#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;
}