标签:
以下是用动态数组实现的线性表顺序存储
#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 5//符号常量,代表线性表存储空间初始分配量 #define LIST_INCREMENT 10//符号常量,代表线性表存储空间的分配增量 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int ElemType;//ElemType这里假设为int,可以根据需要进行更改 typedef int Status;//Status是函数的类型,其值是函数结果状态代码,如OK等 typedef struct sqList//线性表顺序存储结构 { ElemType *elem;//存储空间基址 int length; //线性表当前长度 int listsize;//当前分配的存储容量 }SqList; /*初始化顺序线性表*/ Status InitList(SqList *L) { L->elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType)); if(!(L->elem))//存储分配失败 return ERROR; L->length=0;//空表长度为0 L->listsize=LIST_INIT_SIZE;//初始存储容量 return OK; } /*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1*/ /*操作结果:在L中第i个位置插入新的数据元素e,L的长度加1*/ Status ListInsert(SqList *L,int i,ElemType e) { ElemType *newbase; int k; if(L->length==L->listsize)//顺序线性表已满 { newbase=(ElemType *) realloc(L->elem,(L->listsize + LIST_INCREMENT) * sizeof(ElemType));//增大内存 if(!newbase) return ERROR; L->elem=newbase;//新基址 L->listsize+=LIST_INCREMENT;//增加存储容量 } if(!(i>=1&&i<=L->length+1))//i不属于插入的合适位置,1至length+1 return ERROR; if(i!=L->length+1)//插入的位置不在表尾 { for(k=L->length-1;k>=i-1;k--)//从插入位置开始以后的所有数据后移,注意是从最后一个元素开始 *(L->elem+k+1)=*(L->elem+k); } *(L->elem+i-1)=e;//插入新元素 L->length++;//表长加1 return OK; } /*初始条件:顺序线性表L已存在/ //操作结果:输出L的每个数据元素*/ Status ListTraverse(SqList L) { int i; for(i=0;i<L.length;i++) printf("%d ",*(L.elem++)); printf("\n"); return OK; } /*初始条件:顺序线性表L已存在*/ /*操作结果:若L为空表,则返回TRUE,否则返回FALSE*/ Status ListEmpty(SqList L) { if(L.length==0) return TRUE; else return FALSE; } /*初始条件:顺序线性表L已存在*/ /*操作结果:将L重置为空表*/ Status ClearList(SqList *L) { L->length=0; return OK; } /*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/ /*操作结果:用e返回L中第i个数据元素的值*/ Status GetElem(SqList L,int i,ElemType *e) { if(L.length==0)//顺序线性表为空 return ERROR; if(!(i>=1&&i<=L.length))//i不属于合适的位置 return ERROR; *e=*(L.elem+i-1); return OK; } /*初始条件:顺序线性表L已存在*/ /*操作结果:返回L中第1个与e满足关系的数据元素的位序*/ int LocateElem(SqList L,ElemType e) { int i; if(L.length==0)//顺序线性表为空 return 0; for(i=0;i<L.length;i++) { if(*(L.elem+i)==e) return i+1; } return 0; } /*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/ /*操作结果:删除L的第i个位置的数据元素,并用e返回其值,L的长度减1*/ Status ListDelete(SqList *L,int i,ElemType *e) { int k; if(L->length==0)//顺序线性表为空 return ERROR; if(!(i>=1&&i<=L->length))//i不属于删除的合适位置,1至length return ERROR; *e = *(L->elem +i-1); if(i!=L->length)//删除的位置不在表尾 { for(k=i;k<=L->length-1;k++)//将删除位置后面所有的数据元素前移 *(L->elem+k-1)=*(L->elem+k); //L->elem[k-1]=L->elem[k];//这里也可以利用数组的语法[] } L->length--; return OK; } /*初始条件:顺序线性表L已存在*/ /*操作结果:返回L中数据元素个数*/ int ListLength(SqList L) { return L.length; } /*初始条件:顺序线性表L已存在*/ /*操作结果:将Lb中所有不在L中的元素插入到L中*/ void UnionL(SqList *La,SqList Lb) { int La_len,Lb_len,i; ElemType e; La_len=ListLength(*La); Lb_len=ListLength(Lb); for(i=1;i<=Lb_len;i++) { GetElem(Lb,i,&e); if(!LocateElem(*La,e))//未找到 ListInsert(La,++La_len,e); } } int main() { SqList La,Lb; int i,j,k; ElemType e; i = InitList(&La); for(j=1;j<=5;j++) ListInsert(&La,1,j); printf("在L的表头依次插入1~5后,L->data = "); ListTraverse(La); printf("L.length = %d\n",La.length); i=ListEmpty(La); printf("L是否空:i = %d(1:是 0:否)\n",i); i=ClearList(&La); printf("清空L后:L.length = %d\n",La.length); i=ListEmpty(La); printf("L是否空:i = %d(1:是 0:否)\n",i); for(j=1;j<=10;j++) ListInsert(&La,j,j); printf("在L的表尾依次插入1~10后,L->data = "); ListTraverse(La); printf("L.length = %d\n",La.length); i=ListInsert(&La,1,0); printf("在L的表头插入0后:L.data="); ListTraverse(La); printf("L.length = %d\n",La.length); GetElem(La,5,&e); printf("第5个元素的值为:%d\n",e); for(j=3;j<=4;j++) { k=LocateElem(La,j);//查找位序 if(k) printf("元素%d的位序是%d\n",j,k); else printf("没有值为%d的元素\n",j); } j=9;//删除第9个元素 i=ListDelete(&La,j,&e); if(i==ERROR) printf("删除第%d个数据失败\n",j); else printf("删除第%d个的元素值为:%d\n",j,e); printf("L.length = %d\n",La.length); printf("依次输出L的元素:"); ListTraverse(La); k=ListLength(La); j=k+1;//删除第length+1个元素 i=ListDelete(&La,j,&e); if(i==ERROR) printf("删除第%d个数据失败\n",j); else printf("删除第%d个的元素值为:%d\n",j,e); i=InitList(&Lb); for(j=6;j<=15;j++)//构造一个有10个数的Lb i=ListInsert(&Lb,1,j); printf("依次输出Lb的元素:"); ListTraverse(Lb); UnionL(&La,Lb);//L合并Lb中单独存在的元素 printf("L.length = %d\n",La.length); printf("依次输出合并了Lb的L的元素:"); ListTraverse(La); }
标签:
原文地址:http://blog.csdn.net/hyde100/article/details/51890221