您的位置:首页 > 其它

课程设计——学生信息管理系统(顺序表 链表)

2016-09-17 18:58 671 查看
实验目的 :

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<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct
{
char num[22];
char name[22];
int grade;
}Node;
typedef struct
{
Node *Elem;
int Maxsize;			//最多人数
}List;
void welcome()
{
puts("				********欢迎进入学生成绩管理系统********");
puts("				*	      请选择操作:             *");
puts("				*	1:输入学生数目及信息           *");
puts("				*	2:显示所有学生信息             *");
puts("				*	3:删除指定位置学生信息         *");
puts("				*	4:根据姓名查找学生信息         *");
puts("				*	5:插入学生信息                 *");
puts("				*	6:输出指定位置学生成绩         *");
puts("				*	7:输出系统学生人数             *");
puts("				*	8:访问结束                     *");
puts("\n");
}
int i;
void Initlist(int n,List &L)
{
for(i=1;i<=n;i++)
{
printf("请输入学号:");
scanf("%s",L.Elem[i].num);
printf("请输入学生姓名:");
scanf("%s",L.Elem[i].name);
printf("请输入成绩:");
scanf("%d",&L.Elem[i].grade);
printf(" \\(^o^)/  请继续\n");
}
printf("输入结束(*^__^*)\n");
}
void ListDelete(int n,int pos,List &L)
{
for(i=pos;i<n;i++)
L.Elem[i]=L.Elem[i+1];
}
void ListInsert(int n,int pos,List &L)
{
for(i=n;i>pos+1;i--)
L.Elem[i]=L.Elem[i-1];
printf("学号:");
scanf("%s",L.Elem[pos+1].num);
printf("姓名:");
scanf("%s",L.Elem[pos+1].name);
printf("成绩:");
scanf("%d",&L.Elem[pos+1].grade);
}
void GetElem(int n,int pos,List L)
{
if(pos>n)
printf("你输入的数太大啦o(≧口≦)o,里面都没有那么多人呢!\n\n请继续选择操作:");
else
{
printf("学号\t姓名\t成绩   \n");
printf("%s\t%s\t%d\n",L.Elem[pos].num,L.Elem[pos].name,L.Elem[pos].grade);
printf("(^-^)V 这就出来啦!\n");
printf("\n请继续选择操作:");
}
}
int main()
{
welcome();
List L;
L.Maxsize=111;
L.Elem=(Node *)malloc(sizeof(Node)*L.Maxsize);
int op,pos;			// 操作 和 位置
int n=0;
char nam[22];
printf("请选择操作(*^-^*)\n");
while(1)
{
scanf("%d",&op);
if(op==8)
break;
if(op<1||op>8)
{
printf("此操作有误  ┑( ̄Д  ̄)┍,请重新输入\n\n");
continue;
}
if((op>1&&op<8)&&n==0)
{
printf("尚未输入学生信息,请先输入 (⊙﹏⊙)\n\n");
continue;
}
if(op==1)
{
printf("**输入学生数目及信息**\n");
printf("请输入学生人数 (0 ~ 100) : ");
scanf("%d",&n);
while(n>100||n<0)
{
printf("您输入的人数有误,请重新输入人数\n\n");
scanf("%d",&n);
}
puts("");
Initlist(n,L);
printf("\n请选择操作 : ");
continue;
}
if(op==2)
{
printf("**显示所有学生信息**\n");
printf("学号\t姓名\t成绩   \n");
for(i=1;i<=n;i++)
printf("%s\t%s\t%d\n",L.Elem[i].num,L.Elem[i].name,L.Elem[i].grade);
printf("\no(^▽^)o 请选择操作:");
continue;
}
if(op==3)
{
printf("**删除指定位置学生信息**\n");
printf("请输入指定位置:");
scanf("%d",&pos);
ListDelete(n,pos,L);
n--;
printf("操作成功\n请选择操作:");
continue;
}
if(op==4)
{
printf("**根据姓名查找学生信息**\n");
printf("请输入学生姓名:");
scanf("%s",nam);
int flag=0;
for(i=1;i<=n;i++)
{
int A=strcmp(nam,L.Elem[i].name);
if(A==0)
{
printf("学号\t成绩\n");
printf("%s\t%d\n",L.Elem[i].num,L.Elem[i].grade);
flag=1;
break;
}
}
if(flag)
printf("o(* ̄︶ ̄*)o 这就出来啦,继续吧\n\n");
else
printf("对不起,查无此人\n\n");
printf("请选择操作:");
continue;
}
if(op==5)
{
printf("**插入学生信息**\n");
n++;
printf("请输入要插入信息的位置(在此后插入): ");
scanf("%d",&pos);
ListInsert(n,pos,L);
printf("插入成功<( ̄︶ ̄)>\n\n");
printf("请选择操作: ") ;
continue;
}
if(op==6)
{
printf("**输出指定位置学生成绩**\n");
printf("请输入指定位置:");
scanf("%d",&pos);
GetElem(n,pos,L);
continue;
}
if(op==7)
{
printf("**输出系统学生人数**\n");
printf("系统人数为:%d\n\n请选择操作:",n);
}
}
system("pause");
return 0;
};


链表:

(之前多次给 p t 分配空间,不需要)

原来不只是删掉那么简单!改了三个小时!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define false 0
#define true 1
#define bool int
typedef struct Lnode
{
char num[22];
char name[22];
int grade;
struct Lnode *next;
}Lnode,*Linklist;
void welcome()
{
puts("				********欢迎进入学生成绩管理系统********");
puts("				*	      请选择操作:             *");
puts("				*	1:输入学生数目及信息           *");
puts("				*	2:显示所有学生信息             *");
puts("				*	3:删除指定位置学生信息         *");
puts("				*	4:根据姓名查找学生信息         *");
puts("				*	5:插入学生信息                 *");
puts("				*	6:输出指定位置学生成绩         *");
puts("				*	7:输出系统学生人数             *");
puts("				*	8:结束访问                     *");
puts("\n");
}
int i;
void LnodeInit(Linklist &p)
{
p = (Lnode *)malloc(sizeof(Lnode));
p->next = NULL;
}
void InitList(int n,Lnode &L,Linklist &p)
{
for(i=1;i<=n;i++)
{
LnodeInit(p);
printf("请输入学号:");
scanf("%s",p->num);
printf("请输入学生姓名:");
scanf("%s",p->name);
printf("请输入成绩:");
scanf("%d",&p->grade);
Linklist t;
t=&L;
while(t->next!=NULL)		//在 L尾插入 p
t=t->next;
t->next=p;
printf(" \\(^o^)/  请继续\n");
}
}
bool ListDelete(int n,int pos,Lnode &L,Linklist &p)
{
int j=0;
Linklist t;
t=(Lnode *)malloc(sizeof(Lnode));
p=&L;
while(p->next!=NULL&&(j<pos-1))
{
p=p->next;
j++;
}
if(!(p->next)||(j>pos-1))
return false;
t=p->next;
p->next=t->next;
free (t);
return true;
}
bool ListInsert(int pos,Lnode &L,Linklist &p)
{
int j=0;
Linklist t;
t = (Lnode *)malloc(sizeof(Lnode));		// ???
printf("请输入学号:");
scanf("%s",t->num);
printf("请输入学生姓名:");
scanf("%s",t->name);
printf("请输入成绩:");
scanf("%d",&t->grade);
p=L.next;
while(p!=NULL&&(j<pos-1))
{
p=p->next;
j++;
}
if(p==NULL||(j>pos-1))
return false;
t->next=p->next;
p->next=t;
return true;
}
void GetElem(int pos,Lnode L)
{
int j=1;
Linklist t;
t=&L;
t=t->next;
while(t->next&&(j<=pos-1))
{
t=t->next;
j++;
}
printf("学号\t\t姓名\t\t成绩\n");
printf("%s\t\t%s\t\t%d\n",t->num,t->name,t->grade);
}
bool Listesearch(char nam[22],int n,Lnode L,Linklist p)
{
p=&L;
while(p)
{
if(strcmp(p->name,nam)==0)
break;
p=p->next;
}
if(p!=NULL)
{
printf("学号\t\t成绩\n");
printf("%s\t\t%d\n",p->num,p->grade);
return true;
}
return false;
}
int main()
{
welcome();
Lnode L;
L.next=NULL;
Linklist p;
int pos,op,n=0;
char nam[22];
bool flag=false;
printf("请选择操作(*^-^*): ");
while(1)
{
scanf("%d",&op);
if(op==8)
break;
if(op<1||op>8)
{
printf("此操作有误  ┑( ̄Д  ̄)┍,请重新输入\n\n");
continue;
}
if((op>1&&op<8)&&n==0)
{
printf("尚未输入学生信息,请先输入 (⊙﹏⊙)\n\n");
continue;
}
if(op==1)
{
if (flag)
{
printf("您已经输入学生信息,退出前只可以进行除 1 以外的操作\n");
continue;
}
flag=true;
printf("**输入学生数目及信息**\n");
printf("请输入学生人数 (0 ~ 100) : ");
scanf("%d",&n);
InitList(n,L,p);
printf("输入结束(*^__^*)\n");
printf("\n请选择操作 : ");
continue;
}
if(op==2)
{
printf("**显示所有学生信息**\n");
printf("学号\t\t姓名\t\t成绩   \n");
Linklist t;
t=L.next;
while(t!=NULL)
{
printf("%s\t\t%s\t\t%d\n",t->num,t->name,t->grade);
t=t->next;
}
printf("\no(^▽^)o 请选择操作:");
continue;
}
if(op==3)
{
printf("**删除指定位置学生信息**\n");
printf("请输入指定位置:");
scanf("%d",&pos);
if(ListDelete(n,pos,L,p))
printf("删除操作成功\n请选择操作:");
else
printf("删除位置不合理\n请选择操作:");
n--;
continue;
}
if(op==4)
{
printf("**根据姓名查找学生信息**\n");
printf("请输入学生姓名:");
scanf("%s",nam);
if(Listesearch(nam,n,L,p))
printf("o(* ̄︶ ̄*)o 这就出来啦,继续吧\n\n");
else
printf("对不起,查无此人\n");
printf("请选择操作:");
continue;
}
if(op==5)
{
printf("**插入学生信息**\n");
n++;
printf("请输入要插入信息的位置(1-n)(会在此后插入): ");
scanf("%d",&pos);
if(ListInsert(pos,L,p))
printf("插入成功<( ̄︶ ̄)>\n\n");
else
printf("插入失败\n\n");
printf("请选择操作: ") ;
continue;
}
if(op==6)
{
printf("**输出指定位置学生成绩**\n");
printf("请输入指定位置:");
scanf("%d",&pos);
GetElem(pos,L);
continue;
}
if(op==7)
{
printf("**输出系统学生人数**\n");
printf("系统人数为:%d\n请选择操作:\n\n",n);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: