线性表
(看的是严蔚敏清华大学的数据结构(C语言版))
1、线性表:最常用最简单的数据结构,是一个n个数据元素的有限序列。
2、理解重点:顺序存储,任意存取
3、实现线性表前的一些宏定义以及typedef
1 #define LIST_INIT_SIZE 100//存储空间初始分配量 2 #define LISTINCREMENT 10//存储空间的分配增量 3 4 #define ERROR 0 5 #define OK 1 6 #define TURE 1 7 #define FALSE 0 8 9 typedef int ElemType; 10 typedef int Status;
线性表的存储结构
1 typedef struct{ 2 ElemType *elem; //存储空间基址 3 int length;//当前长度 4 int listsize;//当前分配的长度 5 }SqList;
4、部分算法。
1、初始化空表
Status InitList_Sq(SqList *L){
L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)
{
exit(1);//这里存储空间分配失败怎么写??异常退出
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
2、输出线性表
void Output_L(SqList *L) { for(int i = 0;i<L->length;i++) { printf("%d ",L->elem[i]); } printf("\n"); }
3、插入数,参数有插入位置和插入的数(书上的是插入的数的地址)
Status ListInsert_Sq(SqList *L,int i,int e){ int *newbase; int *q; int *p; if(i < 1 || i > L->length) { return ERROR; } if(L->length >= L->listsize) { newbase = (int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int)); if(!newbase) { exit(1); } L->elem = newbase; L->listsize += LISTINCREMENT; } q = &(L->elem[i-1]); for(p = &(L->elem[L->length-1]);p >= q; --p) { *(p+1) = *p; } *q = e; L->length++; return OK; }
4、删除线性表的一个数,参数给定位置,保存删除的值
Status ListDelete_Sq(SqList *L,int i,ElemType *e) { int *p; int *q; if(i < 1 || i > L->length) { return ERROR; } p = &(L->elem[i-1]); *e = *p; q = L->elem+L->length-1;//表尾元素位置 //elem其实是数组的名字,数组首地址 for(++p;p<=q;++p){ *(p-1) = *p; } L->length--; return OK; }
5、查找值,给定值,如果线性表中有就返回位置,如果线性表中没有,就返回0
int LocateElem(SqList *L,ElemType *e) { ElemType *p; p = L->elem; int i = 1; while(i <= L->length){ if(*e == *p) { break; } i++; p++; } // printf("%d\n",i); if(i <= L->length) { return i; } else{ return 0; } }
6、对应主函数
int main() { int j; int a=0; int *e = (int *)malloc(sizeof(int)); SqList *L1 = (SqList *)malloc(sizeof(SqList)); //SqList L1[1]; InitList_Sq(L1); L1->length = 10; for(j = 0; j<L1->length; j++) { L1->elem[j] = j; } Output_L(L1); ElemType LI1 = 8; ListInsert_Sq(L1,5,LI1); Output_L(L1); ListDelete_Sq(L1,5,e); Output_L(L1); printf("%d\n",*e); *e =4; a= LocateElem(L1,e); printf("%d\n",a); free(L1->elem); free(L1); free(e); return 0; }
7、la lb非递减传递给Lc非递减
/La,Lb非递减给Lc
void MergeList(SqList La,SqList Lb,SqList *Lc){
ElemType *pa;
ElemType *pb;
ElemType *pc;
int *pa_last;
int *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));
if(!Lc->elem)
{
exit(3);
}
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++;
}
}

浙公网安备 33010602011771号