学习数据结构了,写下来,加深记忆。
第一篇:
//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( )
{
SeqList L;
//cout<<"线性表以创建"<<endl;
L.length = 0;
return L;
}
// 销毁顺序表
SeqList ListClear(SeqList L)
{
L.length=0;
//cout<<"线性表已销毁"<<endl;
return L;
}
//判断顺序表是否为空表
int ListEmpty(SeqList L)
{
return (L.length==0);
}
//判断顺序表是否为满
int ListFull(SeqList L)
{
return (L.length==MAXSIZE);
}
//求顺序表长度
int ListLength(SeqList L)
{
return L.length;
}
//从顺序表中查找元素
DataType ListGet(SeqList L ,int i)
{
if(i<0||i>L.length-1)
return -1;// 超出表范围,错误,返回-1
return L.data[i-1];//顺序表元素下标从0开始
}
//从顺序表中查找与给定元素值相同的元素在顺序表中的位置
int ListLocate(SeqList L, DataType x)
{
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)
{
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;
if(L.length>MAXSIZE)
printf("表满,错误\n");// 表满,返回错误
for(j = L.length-1;j>=i;j--)
{
L.data[j] = L.data[j-1];
}
L.length++;
L.data[i-1] = x;
return L;
}
/* 从顺序表中删除元素 */
SeqList ListDelete(SeqList L,int i) //i 认为是逻辑结构的位置,即从1开始
{
int j;
if(i<1||i>L.length)
{
printf("错误\n");// 表空,返回错误
return;
}
for(j = i;j<L.length;j++)
L.data[j-1] = L.data[j];
L.length--;
return L;
}
/*求顺序表中元素的前驱*/
void ListPrior (SeqList L,DataType e)
{
DataType i,k = -1;
if(L.data[0] == e)
{
printf("顺序表第一个元素没有前驱\n");
return ;// 顺序表第一个元素没有前驱
}
for(i = 1;i<L.length;i++)
if(e == L.data[i])
k = i-1;
if(k==-1)
{
printf("顺序表中没有元素 %d \n",e);
return ;
}
else
printf("元素 %d 的前驱为 %d \n",e,L.data[k]);
}
/*求顺序表中元素的后继*/
void ListNext(SeqList L,DataType e)
{
DataType i,k = -1;
if(L.data[L.length-1] == e)
{
printf("顺序表最后一个元素没有后继 \n");// 顺序表最后一个元素没有后继
return ;
}
for(i = 0;i<L.length-1;i++)
if(e == L.data[i])
k = i+1;
if(k==-1)
{
printf("顺序表中没有元素 %d \n",e);
return ;
}
else
printf("元素 %d 的后继为 %d \n",e,L.data[k]);
}
//输出顺序表(遍历顺序表 )
void Prinlist(SeqList L)
{
int i;
for(i = 0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
void mainScreen()
{
printf("请输入序号以使用以下功能 \n");
printf("0. 退出程序\n");
printf("1. 建立顺序表\n");
printf("2. 插入元素,输入元素 x \n");
printf("3. 插入元素,输入元素 x , 插入位置 i \n");
printf("4. 删除位置为 i 的元素\n");
printf("5. 判断顺序表是否为空 \n");
printf("6. 判断顺序表是否为满 \n");
printf("7. 查询顺序表长度 \n");
printf("8. 遍历顺序表 \n");
printf("9. 查询元素 x 位置 ,输入 x\n");
printf("10. 查询位置为 i 元素,输入 i \n");
printf("11. 查询元素 x 的前驱,输入 x \n");
printf("12. 查询元素 x 的后继,输入 x \n");
printf("13. 销毁顺序表\n");
printf("__________________________________________\n");
}
int main()
{
int n,x,i,tem;
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 ");
scanf("%d%d",&x,&i);
L = ListInsert(L,x,i);
printf("元素 %d 已插入 \n",x);
getchar();
getchar();
system("cls");
mainScreen();
break;
case 4: system("cls");
printf("删除位置为 i 的元素,请输入 i ");
scanf("%d",&i);
int tem = L.length;
L = ListDelete(L,i);
if(tem==L.length)
{
getchar();
getchar();
system("cls");
mainScreen();
continue;
}
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);
printf("元素 %d 位置为 %d \n",x,i );
getchar();
getchar();
system("cls");
mainScreen();
break;
case 10:system("cls");
printf("查询位置为 i 元素,输入 i ");
scanf("%d",&i);
x = ListGet(L,i);
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();
system("cls");
mainScreen();
break;
case 12:system("cls");
printf("查询元素 x 的后继, 请输入 x ");
scanf("%d",&x);
ListNext(L,x);
getchar();
system("cls");
mainScreen();
break;
case 13:system("cls");
printf("销毁顺序表 ");
L = ListClear(L);
printf("顺序表已销毁 ");
getchar();
system("cls");
mainScreen();
break;
default:printf("error");break;
}
}
return 0;
}