严版的数据结构的顺序表的代码已经全部实现了一遍,可以直接在main函数里面测试。
真真切切的感受到了C语言的压力。习惯了Java的便捷与高大上,转而写C真实不适应,无论是指针操作还是地址操作的,都不是很适应。
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define INCREASMENT 10
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
int InitList_Sq(SqList &L)
{ // 初始化顺序表 算法2.3
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(0);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return 1;
}
void CreatList(SqList &L,int length)
{ // 创建 顺序表
int i;
L.length = length;
printf("请输入创建的顺序表:");
for(i=0;i<length;i++){
scanf("%d",&L.elem[i]);
}
}
int LocateElem(SqList L,ElemType e)
{ //查找 2.6
ElemType *p;
int i=1;
p = L.elem;
while(i<=L.length&&e!=*p++){
++i;
}
if(i<=L.length)return i;
else return 0;
}
int Insert(SqList &L,int i,ElemType e)
{ // 插入 算法2.4
ElemType *newbase,*p,*q;
if(i<1||i>L.length+1)return 0;
if(L.length>=L.listsize){
newbase = (ElemType *)realloc(L.elem,(L.listsize+INCREASMENT)*sizeof(ElemType));
if(!newbase)exit(0);
L.elem = newbase;
L.listsize+=INCREASMENT;
}
q = &(L.elem[i-1]);
for(p = &(L.elem[L.length-1]);p>=q;--p)
*(p+1) = *p;
*q=e;
++L.length;
return 1;
}
int Delete(SqList &L,int i,ElemType &e)
{//删除 算法2.5
ElemType *p,*q;
if((i<1)||(i>L.length))return 0;
p = &(L.elem[i-1]);
e = *p;
q = L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1) = *p;
--L.length;
return 1;
}
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)
{ //算法2.7
ElemType *pa,*pb,*pc,*pa_Last,*pb_Last;
pa = La.elem;
pb = Lb.elem;
Lc.listsize = Lc.length = La.length+Lb.length;
pc = Lc.elem = (ElemType *)malloc( Lc.listsize*sizeof(ElemType));
Lc.listsize = Lc.length = La.length+Lb.length;
if(!Lc.elem)exit(0);
pa_Last = La.elem+La.length-1;
pb_Last = Lb.elem+Lb.length-1;
while(pa<=pa_Last && pb<=pb_Last){
if(*pa<=*pb)*pc++ = *pa++;
else *pc++ = *pb++;
}
while(pa<=pa_Last)*pc++ = *pa++;
while(pb<=pb_Last)*pc++ = *pb++;
}
void PrintList(SqList L)
{
int i;
printf("顺序表为 :(");
for(i=0;i<L.length-1;i++){
printf("%d,",L.elem[i]);
}
printf("%d)\n",L.elem[L.length-1]);
}