運行截圖
代碼
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define ElemType int
#define Status int
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct
{
ElemType *elem;
int length;
} SqList;
void menu();
Status InitList(SqList &L); //初始化鏈表
Status CreatList(SqList &L); //賦值
Status PrintList(SqList &L); //打印順序表
Status GetElem(SqList &L, int i, ElemType &e); //順序表的取值
int Locate(SqList &L, ElemType e); //順序表的查找
Status ListInsert(SqList &L, int i, ElemType e); //順序表的插入
Status ListDelete(SqList &L, int i); //順序表的刪除
void DestoryList_Sq(SqList &L); //銷燬順序表
void UnionSqlist(SqList &la, SqList &lb); //舉例應用1
void purge(SqList &la, SqList &lb); //構造線性表la,使其只包括lb中所有值不同的數據元素
Status isequal(SqList &la, SqList &lb); //若線性表la和lb不僅長度相等,且所含數據元素也相同,則返回OK
void menu()
{
printf("\n");
printf("*********順序表基本功能的實現**********\n");
printf("*********1---初始化順序表 **********\n");
printf("*********2---賦值順序表 **********\n");
printf("*********3---打印順序表 **********\n");
printf("*********4---取值 **********\n");
printf("*********5---查找元素是否存在**********\n");
printf("*********6---插入元素 **********\n");
printf("*********7---刪除元素 **********\n");
printf("*********0---退出 **********\n");
printf("\n");
}
int main()
{
int e;
int locate;
SqList L;
int select;
while (1)
{
menu();
printf("請輸入您要實現的功能:\n");
scanf("%d", &select);
switch (select)
{
case 1:
if (InitList(L))
printf("初始化成功\n");
else
printf("初始化失敗\n");
break;
case 2:
CreatList(L);
break;
case 3:
PrintList(L);
break;
case 4:
printf("請輸入元素的位置:\n");
scanf("%d", &locate);
if (GetElem(L, locate, e))
printf("第%d個位置上的數爲%d", locate, e);
else
printf("取值失敗.\n");
break;
case 5:
printf("請輸入要查找的元素:");
scanf("%d", &e);
locate = Locate(L, e);
if (locate)
printf("\n該元素在列表的位置是%d\n", locate);
else
printf("\n不存在該元素\n");
break;
case 6:
printf("請輸入您要插入的位置和元素值:\n");
scanf("%d%d", &locate, &e);
printf("*********插入前************\n");
PrintList(L);
if (ListInsert(L, locate, e))
{
printf("插入成功\n");
printf("*********插入後************\n");
PrintList(L);
}
else
printf("插入失敗\n");
break;
case 7:
printf("請輸入您要刪除的位置:\n");
scanf("%d", &locate);
printf("*********刪除前************\n");
PrintList(L);
if (ListDelete(L, locate))
{
printf("刪除成功\n");
printf("*********刪除後************\n");
PrintList(L);
}
else
printf("刪除失敗\n");
break;
case 0:
return 0;
default:
printf("對不起,暫沒有該功能。\n");
}
}
SqList la, lb;
/*
UnionSqlist(la,lb);
printf("*****兩表合併後的結果爲:*******\n");
PrintList(la);
printf("目前la表的表長爲:%d\n",la.length);
*/
//對線性表lb提純
/* purge(la,lb); */
//比較兩個列表是否相等
if (isequal(la, lb))
printf("la和lb相等。\n");
else
printf("la和lb不相等。\n");
return 0;
}
Status InitList(SqList &L)
{
L.elem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));
if (!L.elem)
exit(OVERFLOW);
L.length = 0;
return OK;
}
Status CreatList(SqList &L)
{
int num, i;
printf("******現在開始賦值********\n");
printf("請輸入總個數:\n");
scanf("%d", &num);
for (i = 0; i < num; i++)
{
printf("請輸入第%d個數:", i + 1);
scanf("%d", &L.elem[i]);
L.length++;
}
if (L.length == num)
return OK;
else
return ERROR;
}
Status PrintList(SqList &L)
{
if (!L.length)
return ERROR;
int i = 0;
printf("*******打印開始********\n");
for (; i < L.length; i++)
printf("%d ", L.elem[i]);
printf("\n");
printf("*******打印結束********\n");
return OK;
}
Status GetElem(SqList &L, int i, ElemType &e)
{
if (i < 1 || i > L.length)
return ERROR;
e = L.elem[i - 1];
return OK;
}
int Locate(SqList &L, ElemType e)
{
int i = 0;
for (; i < L.length; i++)
if (e == L.elem[i])
return i + 1;
return 0;
}
Status ListInsert(SqList &L, int i, ElemType e)
{
//1.判斷是否合法
if (i < 1 || i > L.length + 1)
return ERROR;
//2.判斷順序表的存儲空間是否已滿,若滿則返回error.
if (L.length == MAXSIZE)
return ERROR;
//3.將第n個至第i個位置的元素依次向後移動一個位置,空出第i個位置(i=n+1時無需移動)。
int j;
for (j = L.length - 1; j >= i - 1; j--)
L.elem[j + 1] = L.elem[j];
//4.將要插入的新元素e放入第i個位置
L.elem[i - 1] = e;
//5.表長加1.
L.length++;
return OK;
}
Status ListDelete(SqList &L, int i)
{
//1、判斷刪除位置是否合法,若不合法則返回ERROR.
if (i < 1 || i > L.length)
return ERROR;
//2、將第i+1個至第n個元素依次向前移動一個位置
int j;
for (j = i; j < L.length; j++)
L.elem[j - 1] = L.elem[j];
//3、表長減1
L.length--;
return OK;
}
void DestoryList_Sq(SqList &L)
{
delete[] L.elem;
L.length = 0;
}
void UnionSqlist(SqList &la, SqList &lb)
{
//將線性表lb中所欲在la中不存在的元素插入到la中,算法執行結束後,線性表lb將不再存在
//初始化la、lb並賦值
InitList(la);
InitList(lb);
printf("請給la表賦值:\n");
CreatList(la);
printf("請給lb表賦值:\n");
CreatList(lb);
//打印檢查
PrintList(la);
PrintList(lb);
int i = la.length, j = 0;
while (j <= lb.length - 1)
{
if (Locate(la, lb.elem[j]))
j++;
else
{
la.elem[i] = lb.elem[j];
la.length++;
i++;
j++;
}
}
DestoryList_Sq(lb);
}
void purge(SqList &la, SqList &lb)
{
//構造線性表la
InitList(la);
//初始化並給lb賦值
InitList(lb);
CreatList(lb);
int j = 0, i = 0;
while (j < lb.length)
{
if (Locate(la, lb.elem[j]))
j++;
else
{
ListInsert(la, i, lb.elem[j]);
i++;
}
}
//打印la
printf("原始數列是:\n");
PrintList(lb);
printf("提純後:\n");
printf("la的長度爲%d:\n", la.length);
PrintList(la);
//銷燬lb
DestoryList_Sq(lb);
}
Status isequal(SqList &la, SqList &lb)
{
//初始化la,lb,lc;
InitList(la);
InitList(lb);
//給la和lb賦值
CreatList(la);
CreatList(lb);
int lena = la.length;
int lenb = lb.length;
if (lena != lenb)
return ERROR;
else
{
SqList lc;
InitList(lc);
//把la的值賦值一份給lc
int i = 0;
for (; i < la.length; i++)
{
lc.elem[i] = la.elem[i];
lc.length++;
}
//打印la和lc進行驗證
/* printf("la爲:\n");
PrintList(la);
printf("lc爲:\n");
PrintList(lc);*/
//進行比較
int j = 0;
for (; j < lenb; j++)
{
if (Locate(lc, lb.elem[j]))
ListDelete(lc, lb.elem[j]);
}
if (lc.length == 0)
return OK;
else
return ERROR;
}
}