顺序表例子

//郑重声明 
//这是同学问的一个为顺序表问题。不是我写的。我按照他的思路改写的。
//如果写的太垃圾,和我没关系。 
//这题目改的头晕脑涨。可以看看,但是千万别按照这个学。 
#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; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值