天天看點

用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、泛型

繼續閱讀