数据结构线性表之顺序表

#include<stdio.h>
#include<stdlib.h>


#define  Ini_length   100
#define  List_liength  10 
#define   Error  0
#define   Ok   1

typedef  int EmleType;
typedef  int Status ;
typedef  struct Sqllist                                    //定义一个结构体类型(存放<链表指针,链表长度,链表最大容量>)
	{
		EmleType  *emle ; 
		int length;
		int size;
	}Sqllist;
Status Ini_Sqllist (Sqllist  *L)                              //初始化一个空表
{
	L->emle=(EmleType *)malloc(Ini_length*sizeof(EmleType));
	if(!L->emle)    return   Error;
	L->length= 0;
	L->size = Ini_length;   return Ok;
}

Sqllist  Creat_list (Sqllist *L)                         //创建一个线性表  返回这个表
{
     int s ;
	 EmleType  *newbase ;
	 printf("输入顺序表的元素,以0结束 ");
	 scanf( "%d",&s );
	 while (s!=0)
	 {
		if(L->length>L->size)                                   //如果输入的数据的长度大于了之前设置的顺序表的长度则给顺序表增加长度
		 {                                                      //用realloc函数增加顺序表的长度
			 newbase = (EmleType*)realloc(L->emle,(L->size+List_liength)*sizeof(EmleType));
			 if (!newbase)   exit(1);
			 L->emle=newbase;
			 L->size=L->size+List_liength;
		 }

		 L->emle[L->length]=s;
		 L->length++;

		 scanf("%d",&s);
	 }
	 return  (*L);
}

Status GetEmel(Sqllist *L,int j ,EmleType *e)                 //获取第j个元素,使其用e来返回第j个元素
{
	int i;
	for (i =0;i<=L->length;i++)
	{
		if(i==(j-1)) { 
			*e=L->emle[i];
			return *e;
		}
	}
	return *e;
}
Sqllist Inset_Sqllist(Sqllist *L,int i ,EmleType e )                //想线性表中插入数据
{
	int j ;
	EmleType *newbase ;
	if(i<0||(i-1)>L->length)   exit(1);
	if(L->length>L->size)
	{
		newbase =(EmleType*)realloc(L->emle,(L->size+List_liength)*sizeof(EmleType));
		if (!newbase)  exit(1);
		L->emle=newbase;
		L->size=L->size+List_liength;
	}

	for (j= L->length;j>i-1;j--)
	{
		L->emle[j]=L->emle[j-1];
	}
	L->emle[i-1]=e;
	L->length++;
	return  (*L);
}

Sqllist  MergeList(Sqllist *La,Sqllist *Lb,Sqllist *Lc)        //将两个表按照非增的顺序结合排列
{
	int  i=1;int k=0;int j = 1;
	int ai,bj;
	Ini_Sqllist(Lc);
	while ((i<= La->length)&&(j<=Lb->length))
	{
		GetEmel(La,i,&ai); GetEmel(Lb,j,&bj);
		if(ai<=bj)    {  Inset_Sqllist(Lc,++k,ai);  ++i;}
		else{ Inset_Sqllist(Lc,++k,bj); ++j;  }
	}

	while((i<= La->length))
	{
		 GetEmel(La,i,&ai);
		 Inset_Sqllist(Lc,++k,ai);  ++i;
	}
	while((j<=Lb->length))
	{
		GetEmel(Lb,j,&bj);
	    Inset_Sqllist(Lc,++k,bj); ++j;
	}
	return *Lc;
}
void print(Sqllist *L)
{
	int i;
	printf("您的顺序表为:");
	for (i=0;i<L->length;i++)
		printf("%d",L->emle[i]);printf("\n");
	printf("\n");
}

void main ()
{
	int e,i,k ;
	Sqllist a,b,c;
	Ini_Sqllist(&a);
	Creat_list(&a);
	print(&a);
	printf("请输入您要插入的数据的位置与数据的值:");
	scanf("%d,%d",&i,&e);
	Inset_Sqllist(&a,i,e);
	print(&a);
	printf("插入第二个顺序表:");
	Ini_Sqllist(&b);
	Creat_list(&b);
	print(&b);
	printf("将第一个和第二个合并后的第三个顺序表为:");
	MergeList(&a,&b,&c);
	print(&c);
	getchar();
	system("puash");

}  
     顺序表的创建和对顺序表进行插入和合并顺序表是我写的第一个数据结构的程序,当时写这个用了有半个多月的时间,天天都看,调试再加上课多,结果半个月才搞出来
     刚开始主要对指针的运用和在函数间如何传递指针不清楚,所以程序总是出错,出的错多了就慢慢就理解了,也慢慢学会了如何调试程序,
      想要定义一个指针来存放一个数组(顺序表)要先给指针用malloc函数赋予一个空间来存放,如果存放的空间不够大了,可以用realloc函数来增加空间的大小
     (指针变量的类型*)realloc(原来的指针变量名,(原来的长度+增加的长度)*sizeof(指针变量的类型))


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值