實驗目的 :
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) 上傳源程序到課堂派。順序表的源程序保存為SqList.cpp,鏈表的源程序保存為LinkList.cpp。
順序表的源程序:
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 typedef int Status; // 定義函數返回值類型 typedef struct { char no[10]; // 學號 char name[20]; // 姓名 int score; // 成績 }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->no); printf("成績:"); scanf("%d",&e->score); printf("輸入完成\n\n"); } void Output(ElemType *e) { printf("姓名:%-20s\n學號:%-10s\n成績:%-10.2d\n\n",e->name,e->no,e->score); } int main() { SqList L; ElemType a,b,c,d; printf("------------10.2.34版-----------\n"); puts("1. 構造順序表"); puts("2. 錄入指定人數的學生信息"); puts("3. 顯示學生表中的所有信息"); puts("4. 根據姓名查找該學生,並返回學號和成績"); puts("5. 根據某指定位置顯示該學生信息"); puts("6. 在指定位置插入學生信息"); puts("7. 在指定位置刪除學生信息"); puts("8. 統計學生個數"); puts("0. 退出"); printf("------------------------\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<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #include<iostream> using namespace std; typedef int Status; // 定義函數返回值類型 typedef struct { char no[10]; // 學號 char name[20]; // 姓名 double score; // 成績 }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&&j<i) { p=p->next; ++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&&j<i-1) { p=p->next; ++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)&&(j<i-1)) { p=p->next; ++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) { cout<<"姓名:"; cin>>e->name; cout<<"學號:"; cin>>e->no; cout<<"成績:"; cin>>e->score; cout<<"完成輸入\n\n"; } void Output(ElemType *e) { printf("姓名:%-20s\n學號:%-10s\n成績:%-10.2lf\n\n",e->name,e->no,e->score); } int main() { LNode L; LinkList p; ElemType a,b,c,d; cout<<"------------10.2.34版 -----------\n"; cout<<"1. 構造順序表\n"; cout<<"2. 錄入指定人數的學生信息\n"; cout<<"3. 顯示學生表中的所有信息\n"; cout<<"4. 根據姓名查找該學生,並返回學號和成績\n"; cout<<"5. 根據某指定位置顯示該學生信息\n"; cout<<"6. 在指定位置插入學生信息\n"; cout<<"7. 在指定位置刪除學生信息\n"; cout<<"8. 統計學生個數\n"; cout<<"0. 退出\n"; cout<<"------------------------\n"; int n,choose=-1; while(choose!=0) { puts("請輸入你要選擇的功能前的序號:"); cin>>choose ; if(choose==0) break; else if (choose==1) { if(InitList(p)) cout<<"建立順序表成功\n"; else cout<<"建立順序表失敗\n"; } else if (choose==2) { cout<<"將要輸入學生的人數:"; cin>>n; for(int i=1;i<=n;i++) { printf("第%d個學生:\n",i); Input(&a); ListInsert(&L,i,a); } } else if (choose==3) { for(int i=1;i<=n;i++) { GetElem(&L,i,b); Output(&b); } } else if (choose==4) { char s[20]; cout<<"請輸入要查找的學生姓名:"; cin>>s; if(Search(L,s,p)) Output(&(p->data)); else cout<<"對不起,查無此人"; puts(""); } else if (choose==5) { cout<<"請輸入要查詢的位置:"; int id1; cin>>id1; GetElem(&L,id1,c); Output(&c); } else if (choose==6) { cout<<"請輸入要插入的位置:"; int id2; cin>>id2; cout<<"請輸入學生信息:\n"; Input(&d); if(ListInsert(&L,id2,d)) { n++; cout<<"插入成功"; ; puts(""); } else { cout<<"插入失敗"; puts(""); } } else if (choose==7) { cout<<"請輸入要刪除的位置:"; int id3; cin>>id3; if(ListDelete(&L,id3)) { n--; cout<<"刪除成功"; puts(""); } else { cout<<"刪除失敗"; puts(""); } } else if (choose==8) { cout<<"已錄入的學生個數為:"<<n<<endl; break; } } cout<<"\n\n謝謝您的使用,請按任意鍵退出\n\n\n"; system("pause"); return 0; }