課程設計——學生資訊管理系統(順序表 連結串列)
實驗目的 :
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;
}