目录
1、运行截图
2、代码
#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;
}
}
多谢观看~