您的位置:首页 > 其它

线性表的顺序表示及其基本操作

2017-08-11 19:23 441 查看
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW 1
#define OK 1
#define ERROR 0
/*基本操作
Status Initlist_Sq(Sqlist &L);
Status Creat_Sq(Sqlist &L);
Status Destory_Sq(Sqlist &L);
Status clear_Sq(Sqlist &L);
Status ListEmpty(Sqlist &L);
Status GetElem(Sqlist &L,int i);
Status GetElem(Sqlist &L,int i);
Status insert_Sq(Sqlist &L,int i,int e);
Status delete_Sq(Sqlist &L,int j);
Status inverse_Sq(Sqlist &L);//就地逆置
void show_Sq(Sqlist L); */

typedef  int ElemType;
typedef  int Status;
typedef struct list{
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配存储量
}Sqlist;
//构造一个空的线性表L
Status Initlist_Sq(Sqlist &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE *sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
//创建线性表
Status Creat_Sq(Sqlist &L)
{
int i;
int a;//输入元素个数
printf("请输入要创建的元素个数:\t");
scanf("%d",&a);
Initlist_Sq(L);
L.length=a;
printf("请输入线性表的元素:");
getchar();
for(i=0;i<a;i++)
{
scanf("%d",&
4000
amp;L.elem[i]);
}
return OK;
}
//销毁线性表
Status Destory_Sq(Sqlist &L)
{
if(L.elem)
free(L.elem);
printf("完成顺序表的销毁\n");
return OK;
}
//清空线性表
Status clear_Sq(Sqlist &L)
{
L.length=0;
return OK;
}
//空表验证
Status ListEmpty(Sqlist &L)
{
if(L.length==0)
printf("空表");
else
printf("不是空表");
return OK;
}
//用e返回表中元素
Status GetElem(Sqlist &L,int i)
{
ElemType e;
if(i<1||i>L.length)
printf("i值不合法\n");
else
e=*(L.elem+i-1);
printf("%d",e);
return OK;
}
//插入操作函数
Status insert_Sq(Sqlist &L,int i,int e)
{
ElemType *p,*q,*newbase;
if(i<1||i>L.length+1)
return ERROR;
if(L.length>=L.listsize)//当前存储空间已满,增加分配
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&L.elem[i-1];
for(p=(&L.elem[L.length-1]);p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++L.length;
return OK;
}
//删除操作函数
Status delete_Sq(Sqlist &L,int j)
{
ElemType *p,*q;
if(j<1||j>L.length+1)
return ERROR;
for(p=&(L.elem[j-1]);p<&(L.elem[L.length]);++p)
{
*p=*(p+1);
}
--L.length;
return OK;
}
Status inverse_Sq(Sqlist &L)//就地逆置
{
if(L.length==0) return ERROR;
ElemType temp;
int i=0,j=L.length-1;
for(i=0;i<=(L.length/2)-1;i++)
{
temp=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=temp;
j--;
}
return OK;
}
//遍历函数
void show_Sq(Sqlist L)
{
for(int i=0;i<L.length;i++)
{
printf("%d\t",L.elem[i]);
}
}
int main()
{
Sqlist L;
Creat_Sq(L);
int a=1;
while(a)
{
printf("\n请输入要进行的操作:\n 1.遍历\t2.插入\t3.删除\t4.销毁\t5.清空\t6.空表验证\t7.取元素\t8.逆置");
int i,k;
scanf("%d",&k);
switch(k)
{
case 1:show_Sq(L);
break;
case 2:int j,e;
printf("请输入第i个元素之前插入e:\t");
getchar();
scanf("%d%d",&i,&e);
insert_Sq(L,i,e);
break;
case 3: printf("请输入要删除第i个元素:\t");
getchar();
scanf("%d",&i);
delete_Sq(L,i);
break;
case 4:Destory_Sq(L);
break;
case 5:clear_Sq(L);
break;
case 6:ListEmpty(L);
break;
case 7:scanf("%d",&i);
printf("取第%d个元素:",i);
GetElem(L,i);
break;
case 8:inverse_Sq(L);
break;
default:printf("输入的数字不正确\n");
break;
}//switch
printf("\n是否还要进行操作?(选择是按 1,选择否按 0):");//判断程序是否继续进行
scanf("%d",&i);
if(i!=1)
a=0;
}//while
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: