學習數據結構了,寫下來,加深記憶。
第一篇:
//system("cls"); 控制檯屏幕刷新
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAXSIZE 100
typedef int DataType;
typedef struct
{
DataType data[MAXSIZE];
int length;
}SeqList;
///初始化順序表
SeqList SeqListInit( )/// OK
{
SeqList L;
//cout<<"線性表以創建"<<endl;
L.length = 0;
return L;
}
/// 銷燬順序表
SeqList ListClear(SeqList L)/// OK
{
L.length=0;
//cout<<"線性表已銷燬"<<endl;
return L;
}
///判斷順序表是否爲空表
int ListEmpty(SeqList L)/// OK
{
return (L.length==0);
}
///判斷順序表是否爲滿
int ListFull(SeqList L)/// OK
{
return (L.length==MAXSIZE);
}
///求順序表長度
int ListLength(SeqList L)/// OK
{
return L.length;
}
///從順序表中查找元素
bool ListGet(SeqList L ,int i,DataType &x)/// OK
{
if(i<0||i>L.length)
{
printf("查詢錯誤!\n");
return false;// 超出表範圍,錯誤,返回-1
}
x = L.data[i-1];//順序表元素下標從0開始
return true;
}
///從順序表中查找與給定元素值相同的元素在順序表中的位置
int ListLocate(SeqList L, DataType x)/// OK
{
int i,mun = -1;
for(i = 0;i<L.length;i++)
{
if(L.data[i]==x)
{
mun = i;
}
}
if(mun==-1)
{
printf("當前順序表沒有元素 %d \n",x);
return -1;
}
else
return mun+1;
}
/// 向順序表中插入元素
SeqList ListInsert1(SeqList L,DataType x)/// OK
{
if(L.length==MAXSIZE)
printf("表滿,錯誤\n");// 表滿,返回錯誤
L.length++;
L.data[L.length-1] = x;
return L;
}
/// 插入元素 給定元素位置和值
SeqList ListInsert(SeqList L,int i,DataType x)
{
int j;
i = i-1;
if(L.length>MAXSIZE)
{
printf("表滿,錯誤\n");// 表滿,返回錯誤
return L;
}
for(j = L.length-1;j>i;j--)
{
L.data[j] = L.data[j-1];
}
L.length++;
L.data[i] = x;
return L;
}
/// 從順序表中刪除元素
bool ListDelete(SeqList &L,int i) ///i 認爲是邏輯結構的位置,即從1開始
{
int j;
if(i<1||i>L.length)
{
///printf("刪除遇到錯誤\n");// 表空,返回錯誤
return false;
}
for(j = i;j<L.length;j++)
L.data[j-1] = L.data[j];
L.length--;
return true;
}
/*求順序表中元素的前驅*/
bool ListPrior (SeqList L,DataType e) ///OK
{
DataType i,k = -1;
if(L.data[0] == e)
{
printf("順序表第一個元素沒有前驅\n");
return false;// 順序表第一個元素沒有前驅
}
for(i = 1;i<L.length;i++)
if(e == L.data[i])
k = i-1;
if(k==-1)
{
printf("順序表中沒有元素 %d \n",e);
return false;
}
else
printf("元素 %d 的前驅爲 %d \n",e,L.data[k]);
return true;
}
/*求順序表中元素的後繼*/
bool ListNext(SeqList L,DataType e)///OK
{
int i,k = -1;
if(L.data[L.length-1] == e)
{
printf("順序表最後一個元素沒有後繼 \n");// 順序表最後一個元素沒有後繼
return false;
}
for(i = 0;i<L.length-1;i++)
if(e == L.data[i])
k = i+1;
if(k==-1)
{
printf("順序表中沒有元素 %d \n",e);
return false;
}
else
printf("元素 %d 的後繼爲 %d \n",e,L.data[k]);
return true;
}
//輸出順序表(遍歷順序表 )
void Prinlist(SeqList L)/// OK
{
int i;
for(i = 0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
void mainScreen()
{
printf("請輸入序號以使用以下功能 \n");
printf("0. 退出程序\n");/// OK
printf("1. 建立順序表\n");/// OK
printf("2. 插入元素,輸入元素 x \n");/// OK
printf("3. 插入元素,輸入元素 x , 插入位置 i \n");
printf("4. 刪除位置爲 i 的元素\n");/// OK
printf("5. 判斷順序表是否爲空 \n");/// OK
printf("6. 判斷順序表是否爲滿 \n");/// OK
printf("7. 查詢順序表長度 \n");/// OK
printf("8. 遍歷順序表 \n");/// OK
printf("9. 查詢元素 x 位置 ,輸入 x\n");/// OK
printf("10. 查詢位置爲 i 元素,輸入 i \n");/// OK
printf("11. 查詢元素 x 的前驅,輸入 x \n");/// 返回值無顯示
printf("12. 查詢元素 x 的後繼,輸入 x \n");/// 返回值無顯示
printf("13. 銷燬順序表\n");
printf("__________________________________________\n");
}
int main()
{
int n,x,i;
mainScreen();
SeqList L;
while(scanf("%d",&n)&&n!=0)
{
switch(n)
{
case 1: system("cls");
L = SeqListInit();
printf("順序表已經建立!!\n");
//printf("輸入 任意數字 返回主菜單\n");
//scanf("%d",&temp);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 2: system("cls");
printf("插入元素,請輸入元素 x ");
scanf("%d",&x);
L = ListInsert1(L,x);
printf("元素 %d 已插入 \n",x);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 3: system("cls");
printf("插入元素,請輸入元素 x 及序號 i ");///開始時一直錯誤原因:調用插入函數時 x 和 i 位置反了ListInsert(L,x,i);
scanf("%d%d",&x,&i);
L = ListInsert(L,i,x);
printf("元素 %d 已插入 \n",x);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 4: system("cls");
printf("刪除位置爲 i 的元素,請輸入 i ");
scanf("%d",&i);
if(!ListDelete(L,i))
printf("刪除遇到錯誤!\n");
else
printf("%d 位置已刪除 \n",i);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 5: system("cls");// empty
if(ListEmpty(L))
printf("順序表爲空!!\n");
else
printf("順序表不爲空!!\n");
getchar();
getchar();
system("cls");
mainScreen();
break;
case 6: system("cls");// full
if(ListFull(L))
printf("順序表爲滿!!\n");
else
printf("順序表不爲滿!!\n");
getchar();
getchar();
system("cls");
mainScreen();
break;
case 7: system("cls");
x = ListLength(L);
printf("順序表長度爲 %d \n",x);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 8: system("cls");
printf("遍歷順序表\n");
Prinlist(L);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 9 :system("cls");
printf("查詢元素 x 位置 ,輸入 x ");
scanf("%d",&x);
i = ListLocate(L,x);
if(i!=-1)
printf("元素 %d 位置爲 %d \n",x,i );
else
printf("查找失敗!\n");
getchar();
getchar();
system("cls");
mainScreen();
break;
case 10:system("cls");
printf("查詢位置爲 i 元素,輸入 i ");
scanf("%d",&i);
if(ListGet(L,i,x))
printf("位於位置 %d 的元素爲爲 %d \n",i,x);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 11: system("cls");
printf("查詢元素 x 的前驅, 請輸入 x ");
scanf("%d",&x);
ListPrior(L,x);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 12:system("cls");
printf("查詢元素 x 的後繼, 請輸入 x ");
scanf("%d",&x);
ListNext(L,x);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 13:system("cls");
printf("銷燬順序表 ");
L = ListClear(L);
printf("順序表已銷燬 ");
getchar();
system("cls");
mainScreen();
break;
default:printf("error");
getchar();
getchar();
system("cls");
mainScreen();
break;
}
}
return 0;
}