线性表顺序存储
2014-09-17 21:49
211 查看
#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef int Status; #define ERROR 0 typedef struct { int data[20]; int length; }SqList; /* 初始化顺序线性表 */ int InitList(SqList *q) { q->length=0; return 1; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */ /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ int ListInsert(SqList *q,int i,int data) { int k; if(q->length==20) return 0; if(i<1 || i>q->length+1) return 0; /*if(i<=q->length) { for(k=i-1;k<=q->length-1;k++) { q->data[k+1]=q->data[k]; } }*/ if (i<=q->length) { for(k=q->length-1;k>=i-1;k--) q->data[k+1]=q->data[k]; } q->data[i-1]=data; q->length++; return 1; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:依次对L的每个数据元素输出 */ int ListTraverse(SqList q) { int k; for(k=0;k<=q.length-1;k++) printf("%d ",q.data[k]); printf("\n"); return 1; } /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ int ListEmpty(SqList q) { if(q.length==0) return 1; else return 0; } /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */ int ClearList(SqList *q) { /*int k; for(k=0;k<q->length;k++) { q->data[k]=0; } return 1;*/ q->length=0; return 1; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */ int GetElem(SqList q,int i,int *e) { if(i<1 || i>q.length) return 0; if(i<q.length+1) { *e=q.data[i-1]; } return 1; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */ /* 若这样的数据元素不存在,则返回值为0 */ int LocateElem(SqList q,int data) { int i; if(q.length==0) return 0; for(i=0;i<q.length;i++) { if(data==q.data[i]){ break; } } if(i>=q.length) return 0; return i+1; } /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ int ListLength(SqList q) { return q.length; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */ int ListDelete(SqList *q,int i,int *e) { int k; if(i<1 || i>q->length) return 0; *e=q->data[i-1]; for(k=i-1;k<q->length-1;k++){ q->data[k]=q->data[k+1]; } q->length--; return 1; } int unionL(SqList *q1,SqList q2) { int k; int e; if(q1->length+q2.length>20) return 0; for(k=1;k<=q2.length;k++) { /*GetElem(*q1,k,e); if(LocateElem(*q1,*e))*/ GetElem(q2,k,&e); if(!LocateElem(*q1,e)) ListInsert(q1,q1->length+1,e); } return 1; } int main() { SqList Lb; SqList L; ElemType e; Status i; int j,k; i=InitList(&L); printf("初始化L后:L.length=%d\n",L.length); for(j=1;j<=5;j++) i=ListInsert(&L,1,j); printf("在L的表头依次插入1~5后:L.data="); ListTraverse(L); printf("L.length=%d \n",L.length); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n",i); i=ClearList(&L); printf("清空L后:L.length=%d\n",L.length); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n",i); for(j=1;j<=10;j++) ListInsert(&L,j,j); printf("在L的表尾依次插入1~10后:L.data="); ListTraverse(L); printf("L.length=%d \n",L.length); ListInsert(&L,1,0); printf("在L的表头插入0后:L.data="); ListTraverse(L); printf("L.length=%d \n",L.length); GetElem(L,5,&e); printf("第5个元素的值为:%d\n",e); for(j=3;j<=4;j++) { k=LocateElem(L,j); if(k) printf("第%d个元素的值为%d\n",k,j); else printf("没有值为%d的元素\n",j); } k=ListLength(L); /* k为表长 */ for(j=k+1;j>=k;j--) { i=ListDelete(&L,j,&e); /* 删除第j个数据 */ if(i==ERROR) printf("删除第%d个数据失败\n",j); else printf("删除第%d个的元素值为:%d\n",j,e); } printf("依次输出L的元素:"); ListTraverse(L); j=5; ListDelete(&L,j,&e); /* 删除第5个数据 */ printf("删除第%d个的元素值为:%d\n",j,e); printf("依次输出L的元素:"); ListTraverse(L); //构造一个有10个数的Lb i=InitList(&Lb); for(j=6;j<=15;j++) i=ListInsert(&Lb,1,j); ListTraverse(Lb); unionL(&L,Lb); printf("依次输出合并了Lb的L的元素:"); ListTraverse(L); system("pause"); return 0; }
输出结果: