Lab1 線性表的基本操作及其應用 sqlist linklist
阿新 • • 發佈:2019-02-02
實驗要求
1、 建立一個學生表(5個學生);
2、 顯示該表中所有的元素;
3、 根據姓名查詢到第3個學生的資訊並顯示;
4、 插入一個新的學生並顯示全部學生資訊;
5、 刪除第3個學生的資訊並顯示全部學生資訊;
6、 統計學生表中元素的個數(即學生人數);
7、 退出
實驗結果:
能夠順利完成順序表和單鏈表的建立、插入、刪除等操作。
實驗分析:
1、順序表和單鏈表在各種操作實現過程中的差別
2、程式除錯執行中出現的錯誤資訊原因分析。
參考資訊:
Definition of structure student:
typedef struct {
char no[8]; //8位學號
char name[20]; //姓名
int score; //成績
}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;
順序表如下連結串列如下#include<stdio.h> #include<iostream> #include<cstdio> #include<stdlib.h> #include<string.h> #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define Status int using namespace std; typedef struct { char num[10]; char name[10]; int age; int score; }Stu; typedef struct { Stu *elem; //儲存空間的基地址 int length; //當前長度 }SqList; //順序的結構型別為Sqlist //初始化 Status InitList(SqList &L) //構造一個空的順序表L { L.elem=new Stu[MAXSIZE]; //為順序表分配一個大小為MASIZE的陣列空間 if(!L.elem) exit(OVERFLOW); //儲存空間失敗退出 L.length=0; // 空表長度為0 return OK; } //取值 Status GetElem(SqList L,Stu &e) { int i; if(i<i || i>L.length) return ERROR; //判斷i值是否合理,若不合理,返回ERROR e=L.elem[i-1]; //elem[i-1]儲存第i個數據元素 return OK; } //輸入學生資訊 void input(Stu &e) { cout<<"\t\t\t請輸入姓名:"; cin>>e.name; cout<<"\t\t\t請輸入學號:"; cin>>e.num; cout<<"\t\t\t請輸入年齡:"; cin>>e.age; cout<<"\t\t\t請輸入成績:"; cin>>e.score; cout<<endl; } //顯示學生資訊 void output(Stu &e) { printf("\t\t\t|姓名: %-10s 學號: %-10s 年齡: %-3d 成績: %-3d|\n",e.name,e.num,e.age,e.score); } //查詢 Status LocatedElem(SqList L,Stu e) { int i; for(i=0;i<L.length;i++) //在L中查詢值為e的資料元素,返回其序號 if(!strcmp(e.name, L.elem[i].name)) return i+1; //查詢成功,返回序號i+1 return 0; //查詢失敗,返回0 } //插入 Status ListInsert(SqList &L,Stu e,int i) {//在順序表中第i個位置插入新的元素e,i值合法範圍是1<= i <= L.length+1 if((i<1) || (i>L.length+1)) //i值不合法 return ERROR; if(L.length == MAXSIZE) //儲存空間已滿 return ERROR; int j; for(j=L.length-1;j>=i-1;j--) L.elem[j+1]=L.elem[j]; //插入位置及之後的元素後移 L.elem[i-1]=e; //將新的元素e放入第i個位置 ++L.length; //表長加一 return OK; } //刪除 Status ListDelete(SqList &L,int i) {//在順序表中刪除第i個元素,i值合法範圍是1<= i <= L.length+1 if((i<1) || (i>L.length+1)) //i值不合法 return ERROR; int j; Stu x; for(j=i; j<=L.length-1; j++) { x=L.elem[i-1]; //臨時儲存刪除的元素 L.elem[j-1] = L.elem[j]; //之後的元素前移 } --L.length; //表長減一 return OK; } void Print() { cout<<endl; cout<<"\t\t\t*————————————————————*"<<endl; cout<<"\t\t\t|---------請選擇要執行的功能-------------|"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t|1.建立連結串列 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t|2.輸入學生基本資訊 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t|3.顯示所有學生資訊 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t|4.查詢資訊 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t|5.插入資訊 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t|6.刪除資訊 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t|7.顯示學生總數 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t|8.退出系統 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t*————————————————————*"<<endl<<endl; } int main() { Stu e,stu; SqList L; cout<<"\t\t\t *————————————————————*"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t| 歡迎進入學生資訊管理系統 |"<<endl; cout<<"\t\t\t| |"<<endl; cout<<"\t\t\t *————————————————————*"<<endl<<endl; int n = 1; while(n != 0) { Print(); cout<<"\t\t\t"; cin>>n; if(n<1||n>8) { cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 輸入錯誤,請重新選擇! |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; } switch(n) { case 1: if(InitList(L)) { cout<<"\t\t\t * ——————————————————*"<<endl; cout<<"\t\t\t| 連結串列建立成功! |"<<endl; cout<<"\t\t\t *——————————————————*"<<endl<<endl; } else { cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 連結串列建立失敗! |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; } break; case 2: cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 請輸入學生人數: |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; int n1; cout<<"\t\t\t"; cin>>n1; cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 請輸入學生資訊: |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; for(int i=0; i<n1; i++) { L.length++; input(L.elem[i]); if(i == n1-1) { cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 輸入結束! |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; } } break; case 3: cout<<"\t\t\t*——————————————————————————————*"<<endl; for(int i=0;i<L.length;i++) { output(L.elem[i]); } cout<<"\t\t\t*——————————————————————————————*"<<endl; break; case 4: cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 請輸入所查詢學生姓名: |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; cout<<"\t\t\t"; cin>>e.name; int ans; ans=LocatedElem(L,e); if(ans!=0) { cout<<"\t\t\t*——————————————————————————————*"<<endl; output(L.elem[ans-1]); cout<<"\t\t\t*——————————————————————————————*"<<endl; } else { cout<<"\t\t\t * ———————————————————*"<<endl; cout<<"\t\t\t| 查詢不到此學生資訊,請重新輸入! |"<<endl; cout<<"\t\t\t * ———————————————————*"<<endl<<endl; } break; case 5: cout<<"\t\t\t * —————————————————*"<<endl; cout<<"\t\t\t| 請輸入要插入的位置: |"<<endl; cout<<"\t\t\t * —————————————————*"<<endl<<endl; int I; cout<<"\t\t\t"; cin>>I; cout<<"\t\t\t * —————————————————*"<<endl; cout<<"\t\t\t| 請輸入插入學生的資訊: |"<<endl; cout<<"\t\t\t * —————————————————*"<<endl<<endl; cout<<"\t\t\t姓名:"; cin>>stu.name; cout<<"\t\t\t學號:"; cin>>stu.num; cout<<"\t\t\t年齡:"; cin>>stu.age; cout<<"\t\t\t成績:"; cin>>stu.score; if( ! ListInsert(L,stu,I)) { cout<<"\t\t\t * —————————————————————————*"<<endl; cout<<"\t\t\t| 插入位置不合法,請重新輸入! |"<<endl; cout<<"\t\t\t * —————————————————————————*"<<endl<<endl; } else { cout<<"\t\t\t * —————————————————————————*"<<endl; cout<<"\t\t\t| 插入成功! |"<<endl; cout<<"\t\t\t * —————————————————————————*"<<endl<<endl; } break; case 6: cout<<"\t\t\t * —————————————————*"<<endl; cout<<"\t\t\t| 請輸入要刪除資訊的學生位置: |"<<endl; cout<<"\t\t\t * —————————————————*"<<endl<<endl; int d; cout<<"\t\t\t"; cin>>d; if(ListDelete(L,d) == OK) { cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 操作成功! |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; } else { cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 操作失敗! |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; } break; case 7: cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 總學生人數為:"<<L.length <<" |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; break; case 8: cout<<"\t\t\t —————————————————"<<endl; cout<<"\t\t\t| 謝謝您的使用! |"<<endl; cout<<"\t\t\t —————————————————"<<endl<<endl; exit(0); } } return 0; }
#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
#define OVERFLOW -1
#define Status int
int sum=0;
using namespace std;
typedef struct
{
char num[10];
char name[10];
int age;
int score;
}Stu;
//****單鏈表的儲存結構
typedef struct LNode
{
Stu data; //結點的資料域
struct LNode *next; //結點的指標域
}LNode,*LinkList; //LinkList為指向結構體LNode的指標型別
//初始化
Status InitList(LinkList &L) //構造一個空的單鏈表
{
L=new LNode; //生成新結點作為頭結點 ,用頭指標L指向頭結點
L->next=NULL; //頭節點的指標域置空
return OK;
}
//取值
Status GetElem(LinkList L,Stu &e)
{//在帶頭結點的單鏈表中根據序號i獲取元素的值,用e返回L中第i個數據元素的值
int i,j;
LinkList p;
p->next; //初始化,p指向首元結點,計數器j賦初值為1
j=1;
while(p && j<1) //順鏈域向後掃描,直到p為空或p指向第i個元素
{
p=p->next; //p指向下一個結點
++j; //計數器加1
}
if(!p || j>i)
return ERROR; //i值不合法
e=p->data; //取第i個結點資料域
return OK;
}
//輸入學生資訊
void input(LinkList &L)
{
LinkList p=new LNode; //疑惑點1 改為LinkList p 不能輸入
cout<<"\t\t\t請輸入姓名:";
cin>>p->data.name;
cout<<"\t\t\t請輸入學號:";
cin>>p->data.num;
cout<<"\t\t\t請輸入年齡:";
cin>>p->data.age;
cout<<"\t\t\t請輸入成績:";
cin>>p->data.score;
cout<<endl;
p->next = L->next; //疑惑點2 去除這兩句不能輸出
L->next = p;
sum++;
}
//顯示學生資訊
void output(LinkList &L)
{
LinkList p;
p = L->next;
while(p)
{
printf("\t\t\t|姓名: %-10s 學號: %-10s 年齡: %-3d 成績: %-3d|\n",p->data.name,p->data.num,p->data.age,p->data.score);
p=p->next;
}
}
//查詢
Status LocateElem(LinkList L,Stu &e)
{//在L中查詢值為e的資料元素
cout<<"\t\t\t"; cin>>e.name;
LinkList p;
p=L->next; //初始化,指向首元結點
int flag = -1;
while( p ) //順鏈域向後掃描,直到p為空或者p所指結點的資料域等於e
{
if(strcmp(p->data.name , e.name) == 0)
{
printf("\t\t\t|姓名: %-10s 學號: %-10s 年齡: %-3d 成績: %-3d|\n",p->data.name,p->data.num,p->data.age,p->data.score);
flag = 1;
break;
}
else
p = p->next;
}
if( !p )
{
cout<<"\t\t\t * ———————————————————*"<<endl;
cout<<"\t\t\t| 查詢不到此學生資訊,請重新輸入! |"<<endl;
cout<<"\t\t\t * ———————————————————*"<<endl<<endl;
}
}
//插入
Status ListInsert(LinkList L,Stu e,int i)
{//在連結串列中第i個位置插入新的元素e
LinkList p;
LNode *s;
int j;
p=L; j=0;
while(p && j<(i-1))
{
p=p->next; //查詢第i-1個結點,p指向該結點
++j;
}
if(!p || j>i-1) //i>n+1或者i<1
{
cout<<"\t\t\t * —————————————————*"<<endl;
cout<<"\t\t\t| 插入位置不合法! |"<<endl;
cout<<"\t\t\t * —————————————————*"<<endl<<endl;
}
else
{
s=new LNode; //生成新結點*s
s->data = e; //將結點*s的資料域置為e
s->next = p->next; //將結點*s的指標域指向結點ai
p->next = s; //將結點*p的指標域指向結點*s
sum++; //插入成功總數加一
cout<<"\t\t\t * —————————————————*"<<endl;
cout<<"\t\t\t| 請輸入插入學生的資訊: |"<<endl;
cout<<"\t\t\t * —————————————————*"<<endl<<endl;
cout<<"\t\t\t姓名:"; cin>>s->data.name;
cout<<"\t\t\t學號:"; cin>>s->data.num;
cout<<"\t\t\t年齡:"; cin>>s->data.age;
cout<<"\t\t\t成績:"; cin>>s->data.score;
}
// return ERROR;
// return OK;
}
//刪除
Status ListDelete(LinkList &L,int i)
{//在帶頭結點的單鏈表L中,刪除第i個元素
LinkList p,q;
int j=0;
p=L;
while((p->next) && (j<i-1))
{
p = p->next; //查詢第i-1個結點,p指向該結點
++j;
}
if(!(p->next) || (j>i-1)) //i>n或者i<1時,刪除位置不合理
return ERROR;
q=p->next; //臨時儲存被刪結點以備釋放
p->next=q->next; //改變刪除結點前驅結點的指標域
delete q; //釋放刪除結點的空間
return OK;
}
void Print()
{
cout<<endl;
cout<<"\t\t\t*————————————————————*"<<endl;
cout<<"\t\t\t|---------請選擇要執行的功能-------------|"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t|1.建立連結串列 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t|2.輸入學生基本資訊 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t|3.顯示所有學生資訊 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t|4.查詢資訊 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t|5.插入資訊 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t|6.刪除資訊 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t|7.顯示學生總數 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t|8.退出系統 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t*————————————————————*"<<endl<<endl;
}
int main()
{
Stu e,stu;
LinkList p;
LinkList L;
cout<<"\t\t\t *————————————————————*"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t| 歡迎進入學生資訊管理系統 |"<<endl;
cout<<"\t\t\t| |"<<endl;
cout<<"\t\t\t *————————————————————*"<<endl<<endl;
int n = 1;
while(n != 0)
{
Print();
cout<<"\t\t\t";
cin>>n;
if(n<1||n>8)
{
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 輸入錯誤,請重新選擇! |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
}
switch(n)
{
case 1:
if(InitList(L))
{
cout<<"\t\t\t * ——————————————————*"<<endl;
cout<<"\t\t\t| 連結串列建立成功! |"<<endl;
cout<<"\t\t\t *——————————————————*"<<endl<<endl;
}
else
{
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 連結串列建立失敗! |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
}
break;
case 2:
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 請輸入學生人數: |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
int n1;
cout<<"\t\t\t"; cin>>n1;
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 請輸入學生資訊: |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
for(int i=0; i<n1; i++)
{
input(L);
if(i == n1-1)
{
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 輸入結束! |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
}
}
break;
case 3:
cout<<"\t\t\t*——————————————————————————————*"<<endl;
output(L);
cout<<"\t\t\t*——————————————————————————————*"<<endl;
break;
case 4:
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 請輸入所查詢學生姓名: |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
LocateElem( L,e);
break;
case 5:
cout<<"\t\t\t * —————————————————*"<<endl;
cout<<"\t\t\t| 請輸入要插入的位置: |"<<endl;
cout<<"\t\t\t * —————————————————*"<<endl<<endl;
int I;
cout<<"\t\t\t"; cin>>I;
ListInsert(L,e,I);
break;
case 6:
cout<<"\t\t\t * —————————————————*"<<endl;
cout<<"\t\t\t| 請輸入要刪除資訊的學生位置: |"<<endl;
cout<<"\t\t\t * —————————————————*"<<endl<<endl;
int d;
cout<<"\t\t\t"; cin>>d;
if(ListDelete(L,d) == OK)
{
sum--; //總刪除成功數減一
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 操作成功! |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
}
else
{
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 操作失敗! |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
}
break;
case 7:
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 總學生人數為:"<<sum<<" |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
break;
case 8:
cout<<"\t\t\t —————————————————"<<endl;
cout<<"\t\t\t| 謝謝您的使用! |"<<endl;
cout<<"\t\t\t —————————————————"<<endl<<endl;
exit(0);
}
}
return 0;
}