#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(指针变量的类型))