#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
#define initSize 20
typedef struct{
int *data;
int len,maxsize;//当前元素个数和最大容量
}SqList;
bool InitList(SqList *L);
bool ListInsert(int i,int x,SqList *L);
bool ListDelete(int i,SqList *L);
int LocateElem(int x,SqList *L);
void ListPrint(SqList *L);
void ListRevrse(SqList *L);
void DeleteElem(SqList *L);
void MergeList(SqList *LA,SqList *LB,SqList *L);
int main()
{
SqList L,LA,LB;
InitList(&LA);
LA.data[0]=1;LA.data[1]=3;LA.data[2]=5;LA.data[3]=7;LA.data[4]=9;
LA.len=5;
InitList(&LB);
LB.data[0]=2;LB.data[1]=4;LB.data[2]=5;LB.data[3]=6;LB.data[4]=10;LB.data[5]=11;LB.data[6]=12;
LB.len=7;
InitList(&L);
ListPrint(&L);
/*ListInsert(1,1,&L);
ListInsert(2,2,&L);
ListInsert(3,2,&L);
ListInsert(4,2,&L);
ListInsert(5,2,&L);
ListInsert(6,3,&L);
ListInsert(7,3,&L);
ListInsert(8,3,&L);
ListInsert(9,4,&L);
ListInsert(10,4,&L);
ListInsert(11,5,&L);
ListPrint(&L);
printf("-------在第2个位置插入80--------\n");
bool flag=ListInsert(2,80,&L);
if(flag==false)
printf("插入出错!\n");
else
ListPrint(&L);
printf("-------删除第4个位置的数据--------\n");
ListDelete(4,&L);
ListPrint(&L);
printf("-------找出4位于第几个位置--------\n");
int pos=LocateElem(67,&L);
printf("%d\n",pos);
printf("-------逆置线性表--------\n");
ListRevrse(&L);
ListPrint(&L);
printf("-------删除重复的元素--------\n");
DeleteElem(&L);
ListPrint(&L);*/
printf("-------合并表--------\n");
MergeList(&LA,&LB,&L);
ListPrint(&L);
printf("-------交换顺序--------\n");
MergeList(&L,5,6);
ListPrint(&L);
return 0;
}
bool InitList(SqList *L)//构造一个空的线性表
{
L->data=(int*)malloc(initSize*sizeof(int));
if(L->data==NULL)
return false;
L->len=0;
L->maxsize=initSize;
return true;
}
bool ListInsert(int i,int x,SqList *L)//插入元素
{
int j;
if(i>L->len+1||i<1)//判断插入位置是否合法
return false;
if(L->len>=L->maxsize)//判断表是否已满
return false;
for(j=L->len;j>=i;j--){
L->data[j]=L->data[j-1];
}
L->data[j]=x;
L->len++;
return true;
}
bool ListDelete(int i,SqList *L)//删除元素
{
int j;
if(i<1||i>L->len)//判断删除位置是否合法
return false;
for(j=i;j<L->len;j++)
L->data[j-1]=L->data[j];
L->len--;
return true;
}
int LocateElem(int x,SqList *L)//查找元素
{
int i;
for(i=0;i<L->len;i++){
if(L->data[i]==x){
return i+1;
}
}
return 0;
}
void ListRevrse(SqList *L)//逆置元素,要求空间复杂度为(1)
{
int i,j,dep;
for(i=0;i<L->len/2;i++)
{
j=L->len-1-i;
dep=L->data[i];
L->data[i]=L->data[j];
L->data[j]=dep;
}
}
void DeleteElem(SqList *L)//删除重复的元素
{
int i,n=0,k=L->data[0];
for(i=1;i<L->len;i++)
{
if(L->data[i]==k)
n++;
else
k=L->data[i];
L->data[i-n]=L->data[i];
}
L->len-=n;
}
void MergeList(SqList *LA,SqList *LB,SqList *L)//合并
{
int i=0,j=0;
while(i<LA->len&&j<LB->len)
{
if(LA->data[i]<=LB->data[j])
{
L->data[i+j]=LA->data[i];
i++;
}
else
{
L->data[i+j]=LB->data[j];
j++;
}
}
if(i==LA->len)
{
for(;j<LB->len;j++)
L->data[i+j]=LB->data[j];
}
else
{
for(;i<LA->len;i++)
L->data[i+j]=LB->data[i];
}
L->len=i+j;
}
void ExchangeList(SqList *L,int m,int n)//将数组中两个线性表顺序互换
{
int i;
if(m<n)
{
int s[n];
for(i=0;i<n;i++)
s[i]=L->data[i+m];
for(i=0;i<m;i++)
L->data[n+i]=L->data[i];
for(i=0;i<n;i++)
L->data[i]=s[i];
}
else
{
int s[m];
for(i=0;i<m;i++)
s[i]=L->data[i];
for(i=0;i<n;i++)
L->data[i]=L->data[m+i];
for(i=0;i<m;i++)
L->data[n+i]=s[i];
}
}
void ListPrint(SqList *L)
{
int i;
if(L->len==0)
printf("线性表为空\n");
for(i=0;i<L->len;i++){
printf("%d\n",L->data[i]);
}
printf("length=%d\n",L->len);
}
顺序表的基本操作用c语言实现
最新推荐文章于 2024-03-21 23:44:43 发布