天天看点

用c语言建立线性顺序表完成建立链表,插入,删除,查找,输出的操作,数据结构第一次作业(学生信息管理系统-顺序表&&链表)...

实验目的 :

1 、掌握线性表的定义;

2 、掌握线性表的基本操作,如建立、查找、插入和删除等。

实验内容:

定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能:

(1)根据指定学生个数,逐个输入学生信息;

(2)逐个显示学生表中所有学生的相关信息;

(3)根据姓名进行查找,返回此学生的学号和成绩;

(4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(5)给定一个学生信息,插入到表中指定的位置;

(6)删除指定位置的学生记录;

(7)统计表中学生个数。

参考信息 :

Definition of structure student :

typedef struct {

char no[8];   //8 位学号

char name[20]; // 姓名

int price;     // 成绩

}Student;

Definition of sequential list:

typedef  struct {

Student  *elem;     // 指向数据元素的基地址

int  length;       // 线性表的当前长度

}SqList ;

Definition of linked list :

typedef struct LNode{

Student   data;       // 数据域

struct LNode  *next;   // 指针域

}LNode,*LinkList;

实验要求 :

(1)程序要添加适当的注释,程序的书写要采用 缩进格式 。

(2)程序要具在一定的 健壮性,即当输入数据非法时,程序也能适当地做出反应,如 插入删除时指定的位置不对 等等。

(3)程序要做到 界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

(4)根据实验报告模板详细书写实验报告,在实验报告中给出链表 根据姓名进行查找的算法和插入算法的流程图 。

为了完成作业,就没好好做到界面友好,例如输入一些不合法的要求时,程序会陷入死循环

顺序表:

#include#include#include#include#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define MAXSIZE 100

typedef int Status; // 定义函数返回值类型

typedef struct

{

char num[10]; // 学号

char name[20]; // 姓名

double grade; // 成绩

}student;

typedef student ElemType;

typedef struct

{

ElemType *elem; // 存储空间的基地址

int length; // 当前长度

}SqList;

Status InitList(SqList *L) // 构造空的顺序表 L

{

L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);

if(!L->elem) exit(OVERFLOW);

L->length=0;

return OK;

}

ElemType GetElem(SqList &L,int i) // 访问顺序表,找到 i位置,返回给 e

{

return L.elem[i];

}

int Search(SqList &L,char str[]) // 根据名字查找,返回该同学在顺序表中的编号

{

for(int i=1;i<=L.length;i++)

{

if(strcmp(L.elem[i].name,str)==0)

return i;

}

return 0;

}

Status ListInsert(SqList &L,int i,ElemType e) // 在 i位置插入某个学生的信息

{

if((i<1)||(i>L.length+1))return ERROR;

if(L.length==MAXSIZE)return ERROR;

for(int j=L.length;j>=i;j--)

{

L.elem[j+1]=L.elem[j];

}

L.elem[i]=e;

++L.length;

return OK;

}

Status ListDelete(SqList &L,int i) // 在顺序表中删除 i位置的学生信息

{

if((i<1)||(i>L.length))return ERROR;

for(int j=i;j<=L.length;j++)

{

L.elem[j]=L.elem[j+1];

}

--L.length;

return OK;

}

void Input(ElemType *e)

{

printf("姓名:");scanf("%s",e->name);

printf("学号:");scanf("%s",e->num);

printf("成绩:");scanf("%lf",&e->grade);

printf("输入完成\n\n");

}

void Output(ElemType *e)

{

printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n",e->name,e->num,e->grade);

}

int main()

{

SqList L;

ElemType a,b,c,d;

printf("\n********************************\n\n");

puts("1. 构造顺序表");

puts("2. 录入学生信息");

puts("3. 显示学生信息");

puts("4. 输入姓名,查找该学生");

puts("5. 显示某位置该学生信息");

puts("6. 在指定位置插入学生信息");

puts("7. 在指定位置删除学生信息");

puts("8. 统计学生个数");

puts("0. 退出");

printf("\n********************************\n\n");

int x,choose;

while(1)

{

puts("请选择:");

scanf("%d",&choose);

if(choose==0)break;

switch(choose)

{

case 1:

if(InitList(&L))

printf("成功建立顺序表\n\n");

else

printf("顺序表建立失败\n\n");

break;

case 2:

printf("请输入要录入学生的人数(小于100):");

scanf("%d",&x);

for(int i=1;i<=x;i++)

{

printf("第%d个学生:\n",i);

Input(&L.elem[i]);

}

L.length=x;

puts("");

break;

case 3:

for(int i=1;i<=x;i++)

{

a=GetElem(L,i);

Output(&a);

}

break;

case 4:

char s[20];

printf("请输入要查找的学生姓名:");

scanf("%s",s);

if(Search(L,s))

Output(&L.elem[Search(L,s)]);

else

puts("对不起,查无此人");

puts("");

break;

case 5:

printf("请输入要查询的位置:");

int id1;

scanf("%d",&id1);

b=GetElem(L,id1);

Output(&b);

break;

case 6:

printf ("请输入要插入的位置:");

int id2;

scanf("%d",&id2);

printf("请输入学生信息:\n");

Input(&c);

if(ListInsert(L,id2,c))

{

x++;

puts("插入成功");

puts("");

}

else

{

puts("插入失败");

puts("");

}

break;

case 7:

printf("请输入要删除的位置:");

int id3;

scanf("%d",&id3);

if(ListDelete(L,id3))

{

x--;

puts("删除成功");

puts("");

}

else

{

puts("删除失败");

puts("");

}

break;

case 8:

printf("已录入的学生个数为:%d\n\n",L.length);

break;

}

}

printf("\n\n谢谢您的使用,请按任意键退出\n\n\n");

system("pause");

return 0;

}

链表:

#include#include#include#include#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;// 定义函数返回值类型

typedef struct

{

char num[10]; // 学号

char name[20]; // 姓名

double grade; // 成绩

}student;

typedef student ElemType;

typedef struct LNode

{

ElemType data; // 数据域

struct LNode *next; //指针域

}LNode,*LinkList;

Status InitList(LinkList &L) // 构造空链表 L

{

L=(struct LNode*)malloc(sizeof(struct LNode));

L->next=NULL;

return OK;

}

Status GetElem(LinkList L,int i,ElemType &e) // 访问链表,找到 i位置的数据域,返回给 e

{

LinkList p;

p=L->next;

int j=1;

while(p&&jnext;

++j;

}

if(!p||j>i)return ERROR;

e=p->data;

return OK;

}

Status Search(LNode L,char str[],LinkList &p) // 根据名字查找

{

p=L.next;

while(p)

{

if(strcmp(p->data.name,str)==0)

return OK;

p=p->next;

}

return ERROR;

}

Status ListInsert(LinkList L,int i,ElemType e) // 在 i个位置插入某个学生的信息

{

LinkList p,s;

p=L;

int j=0;

while(p&&jnext;

++j;

}

if(!p||j>i-1)return ERROR;

s=(struct LNode*)malloc(sizeof(LNode));

s->data=e;

s->next=p->next;

p->next=s;

return OK;

}

Status ListDelete(LinkList p,int i) // 删除 i位置的学生信息

{

int j=0;

while((p->next)&&(jnext;

++j;

}

if(!(p->next)||(j>i-1))return ERROR;

LinkList q;

q=p->next;

p->next=q->next;

delete q;

return OK;

}

void Input(ElemType *e)

{

printf("姓名:");scanf("%s",e->name);

printf("学号:");scanf("%s",e->num);

printf("成绩:");scanf("%lf",&e->grade);

printf("输入完成\n\n");

}

void Output(ElemType *e)

{

printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n",e->name,e->num,e->grade);

}

int main()

{

LNode L;

LinkList p;

ElemType a,b,c,d;

printf("\n********************************\n\n");

puts("1. 构造链表");

puts("2. 录入学生信息");

puts("3. 显示学生信息");

puts("4. 输入姓名,查找该学生");

puts("5. 显示某位置该学生信息");

puts("6. 在指定位置插入学生信息");

puts("7. 在指定位置删除学生信息");

puts("8. 统计学生个数");

puts("0. 退出");

printf("\n********************************\n\n");

int x,choose=-1;

while(choose!=0)

{

puts("请选择:");

scanf("%d",&choose);

switch(choose)

{

case 1:

if(InitList(p))

printf("成功建立链表\n\n");

else

printf("链表建立失败\n\n");

break;

case 2:

printf("请输入要录入学生信息的人数:");

scanf("%d",&x);

for(int i=1;i<=x;i++)

{

printf("第%d个学生:\n",i);

Input(&a);

ListInsert(&L,i,a);

}

break;

case 3:

for(int i=1;i<=x;i++)

{

GetElem(&L,i,b);

Output(&b);

}

break;

case 4:

char s[20];

printf("请输入要查找的学生姓名:");

scanf("%s",s);

if(Search(L,s,p))

Output(&(p->data));

else

puts("对不起,查无此人");

puts("");

break;

case 5:

printf("请输入要查询的位置:");

int id1;

scanf("%d",&id1);

GetElem(&L,id1,c);

Output(&c);

break;

case 6:

printf ("请输入要插入的位置:");

int id2;

scanf("%d",&id2);

printf("请输入学生信息:\n");

Input(&d);

if(ListInsert(&L,id2,d))

{

x++;

puts("插入成功");

puts("");

}

else

{

puts("插入失败");

puts("");

}

break;

case 7:

printf("请输入要删除的位置:");

int id3;

scanf("%d",&id3);

if(ListDelete(&L,id3))

{

x--;

puts("删除成功");

puts("");

}

else

{

puts("删除失败");

puts("");

}

break;

case 8:

printf("已录入的学生个数为:%d\n\n",x);

break;

}

}

printf("\n\n谢谢您的使用,请按任意键退出\n\n\n");

system("pause");

return 0;

}

上一篇: 8、网络
下一篇: 5、泛型

继续阅读