线性表顺序存储学习
2014-03-23 11:55
405 查看
线性表的顺序存储结构:
定义:用一段地址连续的存储单元一次存储线性表的数据元素。
定义:用一段地址连续的存储单元一次存储线性表的数据元素。
/*线性表存储的相应代码: 1.结构代码 2.初始化线性表 3.获得元素操作 4.插入操作 5.删除操作 6.判断线性表是否为空 7.线性表清空 8.线性表中元素e首次出现位置 9.遍历线性表:依次对L的每个数据元素输出 10.将所有的在线性表Lb中,但不在La的数据元素插入La */ #include<stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */ /* 1.线性表的顺序存储的结构代码 */ typedef struct { ElemType data[MAXSIZE]; /* 数组存储数据元素,最大值为MAXSIZE */ int length; /* 线性表当前长度 */ }SqList; /* 2.初始化线性表 */ Status InitList(SqList *L) { L->length = 0; return OK; } /* 3.获得元素操作 */ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */ Status GetElem(SqList L,int i,ElemType *e) { if(L.length == 0 || i<1 || i> L.length) return ERROR; *e = L.data[i-1]; return OK; } /* 4.插入操作 */ /* 如果线性表已满,无法插入,抛出异常;如果插入位置不合理,抛出异常; 从最后一个位置向前便利到第i个位置,分别向后移动一个位置; 将要插入的元素填入位置i处; 表长加1; */ Status ListInsert(SqList *L,int i,ElemType e) { int k; if(L->length == MAXSIZE) return ERROR; if(i<1 || i> L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */ return ERROR; if( i <= L->length) /* 若插入数据位置不在表尾,需进行相应的后移操作 ;在表尾则可以直接插入末端*/ { for(k = L->length-1; k >= i-1;k--) L->data[k+1] = L->data[k]; } L->data[i-1] = e; L->length++; return OK; } /* 5.删除操作 */ /* 如果线性表为空,抛出异常;如果删除位置不合理,抛出异常; 从删除元素位置开始遍历到最后一个元素位置,分别向前移动一个位置; 表长减1; */ Status ListDelete(SqList *L,int i,ElemType *e) { int k; if(L->length == 0) return ERROR; if(i<1 || i> L->length)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */ return ERROR; *e = L->data[i-1]; if( i < L->length) /* 若删除数据位置不在表尾,需进行相应的后移操作 ;在表尾则可以直接删除*/ { for(k = i; k <= L->length-1;k++) L->data[k-1] = L->data[k]; } L->length--; return OK; } /* 6.判断线性表是否为空 ,空返回1,非空返回0*/ Status ListEmpty (SqList L) { if ( L.length == 0 ) return TRUE; else return FALSE; } /* 7.线性表清空*/ Status ClearList(SqList *L) { L->length = 0; return OK; } /* 8.线性表中元素e首次出现位置*/ int LocateElem(SqList L,ElemType e) { int i; if (L.length == 0 ) return 0; for( i = 0; i < L.length; i++ ) if( L.data[i] == e) break; if(i == L.length) return 0; return i+1; } /* 9.遍历线性表:依次对L的每个数据元素输出 */ Status ListTraverse(SqList L) { int i; for(i=0;i<L.length;i++) printf("%d ",L.data[i]); printf("\n"); return OK; } /* 10.将所有的在线性表Lb中,但不在La的数据元素插入La */ void unionL(SqList *La,SqList Lb) { int La_len,Lb_len,i; ElemType e; /*声明La与Lb相同的数据元素 */ La_len = La->length; Lb_len = Lb.length; for (i=1;i<=Lb_len;i++) { GetElem(Lb,i,&e); if (!LocateElem(*La,e)) ListInsert(La,++La_len,e); } } int main() { SqList L,Lb; ElemType e; Status i; int j,k; i=InitList(&L); printf("初始化L后:L.length=%d\n",L.length); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n\n",i); for(j=1;j<=5;j++) i=ListInsert(&L,1,j); printf("在L的表头依次插入1~5后:L.data="); ListTraverse(L); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n\n",i); ListInsert(&L,1,0); printf("在L的表头插入0后:L.data="); ListTraverse(L); printf("L.length=%d \n\n",L.length); GetElem(L,5,&e); printf("第5个元素的值为:%d\n\n",e); for(j=3;j<=6;j++) { k=LocateElem(L,j); if(k) printf("第%d个元素的值为%d\n",k,j); else printf("没有值为%d的元素\n",j); } printf("\n"); k=L.length; /* k为表长 */ for(j=k+1;j>=(k-1);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); printf("\n"); //构造一个有10个数的Lb //SqList Lb; i=InitList(&Lb); for(j=1;j<=10;j++) i=ListInsert(&Lb,1,j); unionL(&L,Lb); printf("依次输出合并后L的元素:"); ListTraverse(L); printf("\n"); i=ClearList(&L); printf("清空L后:L.length=%d\n",L.length); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n\n",i); }
相关文章推荐
- fedora 上安装Sybase Ase
- Linux/Unix 线程同步技术之互斥量(1)
- hdu 1598 find the most comfortable road (并查集)
- Fix Backup Database is terminating abnormally When performing a Farm Backup
- python socket
- IE11 的区别
- Socket异步发送的同步控制
- windows命令行中java和javac、javap使用详解(java编译命令)
- 我的手轻轻滑过键盘
- grep查找字符串
- nyoj_259 茵茵的第一课
- 算法入门经典第八章书上例题与代码(排序从前到后)
- linux下的远程拷贝
- UML---sequence Diagrams
- 新马華人的姓名大多用方言拼音,所以显得很混乱
- 动规 + 打印路径
- ie6错误提示查看方法
- UML之用例图
- rest 服务
- 完数