//郑重声明
//这是同学问的一个为顺序表问题。不是我写的。我按照他的思路改写的。
//如果写的太垃圾,和我没关系。
//这题目改的头晕脑涨。可以看看,但是千万别按照这个学。
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW -1
#define ERROR -2
typedef int status;
typedef int Elemtype;
typedef struct
{
Elemtype *elem;
int length;
int listsize;
}SqList;
void Buildlist_Sq(SqList *L)//建立 空的顺序表
{
L->elem=(Elemtype*)malloc(LIST_INIT_SIZE*sizeof(Elemtype));//分配 100 个大小
L->length=0;//长度为 0
L->listsize=LIST_INIT_SIZE;//大小为100;
}
void Initlist(SqList *L)//初始化顺序表-给顺序表赋值。
{
int i=0,e;
printf("请输入顺序表长度:\n");
scanf("%d",&e);
L->length=e;
while(L->length>L->listsize)
{
L->elem=(Elemtype *)realloc(L->elem,L->length*sizeof(Elemtype));
L->listsize=L->length;
}
while(e>0)
{
printf("请输入第 %d 个元素:",i+1);
scanf("%d",&L->elem[i]);
i++;
e--;
}
printf("输入结束\n\n");
}
void Listinsert(SqList *L,Elemtype a)//插入元素(我写的在末尾插入,在其他地方插入类似)。
{
L->length++;//插入一个,所以长度加一。
while(L->length>=L->listsize)//如果长度大于所分配的内存空间,则执行下面扩大内存。
{
L->listsize+=LISTINCREMENT;//扩大 10 个。
L->elem=realloc(L->elem,L->listsize*sizeof(Elemtype));
}
L->elem[L->length-1]=a;
}
void List_insert(SqList *L,Elemtype a,int pos)//插入元素,在第 pos 个位置插入。
{
L->length++;//插入一个,所以长度加一。
while(L->length>=L->listsize)//如果长度大于所分配的内存空间,则执行下面扩大内存。
{
L->listsize+=LISTINCREMENT;//扩大 10 个。
L->elem=realloc(L->elem,L->listsize*sizeof(Elemtype));
}
for(int i=L->length-1;i>=pos-1;i--)
{
L->elem[i]=L->elem[i-1];
}
L->elem[pos-1]=a;
}
int getlength(SqList L)//求顺序表长度
{
return L.length;
}
int SearchSqList(SqList L,Elemtype a)//查找第一个 元素 a 的位置。
{
int pos=-1;//没找到就返回 -1
for(int i=1;i<=L.length;i++)
{
if(L.elem[i-1]==a)
{
printf("第 %d 位 为 %d\n",i,a);
pos=i;
break;
}
}
return pos;
}
int *Search_allSqList(SqList L,Elemtype a)//查找第所有 元素 a 的位置。
{
int sum=0;
for(int i=1;i<=L.length;i++)
{
if(L.elem[i-1]==a)
{
sum++;
}
}
int *b=malloc(sum*sizeof(int));
int temp=0;
for(int i=1;i<=L.length;i++)
{
if(L.elem[i-1]==a)
{
b[temp]=i;
temp++;
}
}
return b;
}
void Del_allSqList(SqList *L,Elemtype a)//删除所有 元素 a。
{
for(int i=1;i<=L->length;i++)
{
if(L->elem[i-1]==a)
{
for(int j=i-1;j<=L->length;j++)
{
L->elem[j]=L->elem[j+1];
}
L->length--;//每删除一个长度减一。
}
}
}
void Del_posSqList(SqList *L,int pos)//删除所有 第 pos 个元素。
{
for(int i=pos-1;i<L->length;i++)
{
for(int j=i;j<L->length;j++)
{
L->elem[j]=L->elem[j+1];
}
L->length--;//每删除一个长度减一。
}
}
SqList CombinesqList(SqList a,SqList b)//合并 a ,b 顺序表
{
SqList c;
c.length=a.length+b.length;
c.listsize=c.length;
c.elem=malloc(c.length*sizeof(Elemtype));
for(int i=0;i<a.length;i++)
{
c.elem[i]=a.elem[i];
}
for(int i=0;i<b.length;i++)
{
c.elem[a.length+i]=b.elem[i];
}
return c;
}
void Print(SqList L)//输出
{
for(int i=0;i<L.length;i++)
{
printf("顺序表第 %d 个 位置 为 %d\n",i+1,L.elem[i]);
}
printf("输出结束\n");
}
int main()
{
//已经调试完毕。放心使用。
/*
SqList La;
Buildlist_Sq(&La);//建立空顺序表
Initlist(&La);//初始化顺序表
Print(La);//输出
Listinsert(&La,99);//末尾插入99;
Print(La);
List_insert(&La,999,2);//第二个位置插入999 ;
Print(La);
printf("长度为 %d\n",getlength(La));//输出长度。
int m=SearchSqList(La,6);//查找第一个 元6 的位置。
printf("位置为:%d\n",m);//输出长度。
int *mm=Search_allSqList(La,6);
printf("%d,%d",mm[0],mm[2]);
Del_allSqList(&La,7);//删除所有的 7 .
Print(La);
Del_posSqList(&La,1);//输出第一个位置。
Print(La);
free(La.elem);
*/
SqList a;
SqList b;
SqList c;
Buildlist_Sq(&a);//建立空顺序表
Initlist(&a);//初始化顺序表
Buildlist_Sq(&b);//建立空顺序表
Initlist(&b);//初始化顺序表
c=CombinesqList(a,b);
Print(c);
return 0;
}
顺序表例子
最新推荐文章于 2022-10-10 09:13:42 发布