顺序表的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一:顺序表的基本操作。
编写一个完整的程序,实现顺序表的建立、插入、删除、输出等基本运算。
(1)建立一个顺序表,含有n个数据元素。
(2)输出顺序表及顺序表的长度。
(3)在顺序表中删除值为x的结点或者删除给定位置i的结点。
(4)将顺序表就地逆置,即利用原表的存储空间将线性表(a1,a2,...,a n)逆置为(a n,a n-1,...,a1)。
(5)将顺序表按升序排序。
(6)设顺序表中的数据元素递增有序,将x插入到顺序表的适当位置上,以保持该表的有序性。
(7)将两个顺序有序表A和B合并为一个有序表C。
(8)在主函数中设计一个简单的菜单,分别测试上述算法。
#include
#include
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
//创建一个空表
int InitList(SqList &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配空间
if(!L.elem)
return OVERFLOW;
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
//在创建的空表中插入数据
int ListInsert(SqList &L,int i,ElemType e)
{
ElemType* newbase;
//ElemType* q;
if(i<0 || i>L.length+1)
return ERROR;
if(L.length>=L.listsize)//当前空间已满,增加新空间
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
return OVERFLOW;
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
L.elem[i]=e;
//printf("%d ",L.elem[i]);
L.length++;
return OK;
}
//删除位置为i的节点
int ListDelete(SqList &L,int i)
{
ElemType* p;
ElemType* q;
if(i<0 || i>L.length)
return ERROR;
p=&(L.elem[i-1]);
//e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;p++)
*(p-1)=*p;
L.length--;
return OK;
}
//在顺序表中删除数据x
int DeleteX(SqList &L, int x)
{
ElemType* p;
int i;
for(i=0;i if(L.elem[i]==x) { break; } p=&L.elem[i]; //free(p); for(int j=i;j { L.elem[j]=L.elem[j+1]; } L.length--; return OK; } //反转顺序表 int TurnArrond(SqList &L)//翻转顺序表{ ElemType* p; ElemType* q; int t; p=&(L.elem[0]); q=L.elem+L.length-1; for(p;p { t=*q; *q=*p; *p=t; } return OK; } //升序排列顺序表 int ABC(SqList &L) { int a[10000]; int i; for(i=0;i a[i]=L.elem[i]; qsort(a,L.length,sizeof(a[0]),cmp); for(i=0;i L.elem[i]=a[i]; return OK; } //把顺序表升序排列后插入元素e int ListInsertABC(SqList &L,ElemType e) { ElemType* newbase; int i,j; if(L.length+1>=L.listsize)//当前空间已满,增加新空间 { newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase) return OVERFLOW; L.elem=newbase; L.listsize+=LISTINCREMENT; } for(i=0;i if(e break; for(j=L.length;j>i;j--) { L.elem[j]=L.elem[j-1]; } L.length++; L.elem[j]=e; //printf("%d ",L.elem[i]); return OK; } //合并顺序表L,L1为L2 int MergeList(SqList L,SqList L1,SqList &L2) { ElemType* pa; ElemType* pb; ElemType* pc; ElemType* pa_last; ElemType* pb_last; pa=L.elem;