資料結構之順序表和單連結清單的實作-C語言版
一、順序表
1.順序表的建立
//Authors:xiaobei
void CREATE(SqList *L)
{
int i;
printf("請輸入學生的個數:");
scanf("%d",&L->length);
for(i=0;i<L->length;i++)
{
printf("第%d個學生資訊:\n",i+1);
printf("學号:");
scanf("%d",&L->stu[i].stu_num);
printf("姓名:");
scanf("%s",L->stu[i].name);
}
printf("OK");
}
2.順序表查找
//Authors:xiaobei
void LOCATE(SqList L)
{
int i=0;
int number;
printf("\n請輸入要查找學生的學号:");
scanf("%d",&number);
while(i<=L.length-1 && L.stu[i].stu_num!=number)
i++;
if(i<=L.length-1)
printf("學生位置為:%d",i+1);
else
printf("學生資訊不存在!");
}
3.順序表的插入
//Authors:xiaobei
void INSERT(SqList *L)
{
int i,j;
Data e;
printf("\n請輸入插入位置(1<=n<=%d):",L->length+1);
scanf("%d",&i);
if(L->length==MAXSIZE)
printf("資料已滿!\n");
else if
(i<1||i>L->length +1)
printf("輸入位置錯誤!\n");
else
{
{
printf("學号:");
scanf("%d",&e.stu_num);
printf("姓名:");
scanf("%s",e.name);
}
for(j=L->length-1;j>=i-1;j--)
L->stu[j+1] = L->stu[j];
L->stu[i-1] = e;
L->length++;
}
printf("\nOK\n");
}
4.順序表的删除
//Authors:xiaobei
void DELETE(SqList *L)
{
int i,j;
Data elem;
printf("\n請輸入要删除的元素的位置(1<=n<=%d):",L->length);
scanf("%d",&i);
if (L->length==0)
printf("空表!\n");
else if(i<1||i>L->length)
printf("輸入位置錯誤!\n");
else
{
elem = L->stu[i-1];
for(j=i;j<=L->length-1;j++)
L->stu[j-1] = L->stu[j];
L->length--;
}
printf("OK");
}
5.順序表的顯示
//Authors:xiaobei
void PRINT(SqList L)
{
int i;
printf("學号\t\t姓名\n");
for(i=0;i<L.length;i++)
printf("%d\t\t%s\n",L.stu[i].stu_num,L.stu[i].name);
}
6.代碼補全
//Authors:xiaobei
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
struct Data
{
char name[10];
int stu_num;
};
typedef struct
{
int length;
Data stu[MAXSIZE];
}SqList;
//指定SqList為上述結構體的類型名,與結構體的定義相同
void MENU_PRINT();
void CREATE(SqList *L);
void INSERT(SqList *L);
void PRINT(SqList L);
void DELETE(SqList *L);
void LOCATE(SqList L);
//****************主函數****************
void main()
{
SqList Stu_Data;
while(1)
{
int k;
MENU_PRINT();
scanf("%d",&k);
switch(k)
{
case 0:exit(0);break;
case 1:CREATE(&Stu_Data);break;
case 2:INSERT(&Stu_Data);break;
case 3:DELETE(&Stu_Data);break;
case 4:LOCATE(Stu_Data);break;
case 5:PRINT(Stu_Data);
};
}
}
//***********************************
//列印菜單
void MENU_PRINT()
{
printf("\n******************
\n* 1.建立順序表 *
\n* 2.插入元素 *
\n* 3.删除元素 *
\n* 4.查找元素 *
\n* 5.顯示順序表 *
\n* 0.結束程式運作*
\n* 請輸入您的選擇 *
\n******************
\n>>>");
}
7.運作結果
二、單連結清單
1.單連結清單的初始化和建立
//Authors:xiaobei
//單連結清單的初始化
void Status_InitList(LinkList L)
{
L = (LNode*) malloc(sizeof(LNode));
//生成新結點作為頭結點,用頭指針L指向頭結點
L->next = NULL;
printf("成功配置設定存儲空間!\n");
}
//單連結清單的建立
void CreateList_H(LinkList *Li,int n)
{
int i;
LNode *p = NULL;
{
*Li = (LNode*) malloc(sizeof(LNode));
(*Li)->next = NULL;
printf("單連結清單初始化成功!\n……\n");
}
for(i=n;i>0;i--)
{
p = (LNode*) malloc(sizeof(LNode));
printf("請輸傳入連結表元素%d:",i);
scanf("%d",&p->data);
p->next = (*Li)->next;
(*Li)->next = p;
}
printf("單連結清單建立成功!\n……\n");
}
2.單連結清單的取值
//Authors:xiaobei
void Status_GetElem(LinkList L,int i)
{
int j = 1;
LNode *p;
p = L->next;
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
printf("位置有誤!\n");
else
printf("取值成功!該值為:%d\n",p->data);
}
3.單連結清單的查找
//Authors:xiaobei
void LocateElem(LinkList L,int e)
{
int i = 1;
LNode *p = NULL;
p = L->next;
while(p && p->data!=e)
{
p = p->next;
i++;
}
if(i>4 || p->data!=e)
printf("元素不存在!\n");
else
printf("該元素位置為:%d\n",i);
}
4.單連結清單的插入
//Authors:xiaobei
void Status_ListInsert(LinkList *Li,int i,int e)
{
LinkList s;
LNode *p = NULL;
int j;
p = *Li;
j = 0;
while(p && (j<i-1))
{
p = p->next;
++j;
}
if(!p||j>i-1)
printf("輸入位置錯誤!\n");
else
{
s = (LNode*) malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
printf("元素插入成功!\n");
}
}
5.單連結清單的删除
//Authors:xiaobei
void Status_ListDelete(LinkList *Li,int i)
{
LNode *p = NULL,*q = NULL;
int j;
p = *Li;
j = 0;
while((p->next) && (j<i-1))
{
p = p->next;
++j;
}
if(!(p->next)||(j>i-1))
printf("删除位置不合理!\n");
else
{
q = p->next;
p->next = q->next;
free(q);
printf("删除成功!\n");
}
}
6.單連結清單的顯示
//Authors:xiaobei
void Print_List(LinkList L)
{
LNode *p = NULL;
p = L->next;
printf("連結清單元素為:");
while(p)
{
printf("%d,",p->data);
p = p->next;
}
printf("\n");
}
7.代碼補全
//Authors:xiaobei
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void Status_InitList(LinkList L);
void Status_GetElem(LinkList L,int i);
void LocateElem(LinkList L,int e);
void Status_ListInsert(LinkList *Li,int i,int e);
void Status_ListDelete(LinkList *L,int i);
void CreateList_H(LinkList *Li,int n);
//前插法建立,輸入順序和邏輯順序相反,是以需要逆序輸入
void Print_List(LinkList L);
int Link_Length(LinkList L);
void Print_Menu();
void main()
{
int i,n = 4,e,user;
LinkList L = NULL;
LinkList *Li = &L;
CreateList_H(Li,n);
while(1)
{
Print_Menu();
scanf("%d",&user);
if(user>5 || user<0)
printf("輸入選項有誤!");
else
switch(user)
{
case 1:{
printf("請輸入取值位置(0-4):");
scanf("%d",&i);
Status_GetElem(L,i);
break;
}
case 2:{
printf("請輸入要查找的元素:");
scanf("%d",&e);
LocateElem(L,e);
break;
}
case 3:{
printf("請輸入要插入的元素:");
scanf("%d",&e);
printf("請輸入要插入的位置(1-%d):",Link_Length(L)+1);
scanf("%d",&i);
Status_ListInsert(Li,i,e);
break;
}
case 4:{
printf("請輸入要删除的元素位置(1-%d):",Link_Length(L));
scanf("%d",&i);
Status_ListDelete(Li,i);
break;
}
case 5:Print_List(L);break;
case 0:exit(0);
};
}
}
void Print_Menu()
{
printf("\n**********************
\n 1.單連結清單取值
\n 2.單連結清單查找
\n 3.單連結清單插入
\n 4.單連結清單删除
\n 5.顯示單連結清單
\n 0.退出
\n(請輸入序号0-5)
\n**********************
\n>>>");
}
//找到連結清單長度
int Link_Length(LinkList L)
{
int i = 0;
LNode *p = NULL;
p = L->next;
while(p)
{
p = p->next;
i++;
}
return i;
}
8.運作結果