顺序表----12个基本操作实现
2016-11-29 17:51
766 查看
顺序表是指线性表的顺序表示,指的是用一组地址连续的存储单元依次存储线性表的数据元素。只要确定了顺序表的起始位置,顺序表的任一数据元素都可以随机存取,线性表的顺序存储结构是一种随机存取的存储结构。在这点上与高级程序设计语言中的数组十分相似,因此通常用数组来描述数据结构中的顺序存储结构。
接下来是顺序表的12个基本操作和这12个操作在主函数中的检验。
接下来是顺序表的12个基本操作和这12个操作在主函数中的检验。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include<stdio.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct { ElemType *elem; int length; int listsize; }SqList; //1.构造顺序表 Status InitList(SqList &L) { L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (!L.elem) return ERROR; L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; } //2.销毁顺序表 Status DestroyList(SqList &L) { if (L.elem) free(L.elem); if (L.elem == NULL) return OK; else return ERROR; } //3.清空顺序表 void ClearList(SqList &L) { L.length = 0; } //4.判断顺序表是否空表 Status ListEmpty(SqList L) { if (L.length == 0) return ERROR; else return OK; } //5.顺序表求表长 Status ListLength(SqList L) { return L.length; } //6.顺序表的取元素 Status GetElem(SqList L) { int i, e; //取出顺序表中第i个元素e printf("请输入要取的元素的位序:\n"); scanf("%d",&i); if (i<1 || i>L.length) return ERROR; else e = L.elem[i - 1]; printf("要取出的第%d个元素是%d\n",i,e); return OK; } //辅助函数 Status compare(int e1, int e2) { if (e1 == e2) return OK; else return ERROR; } //7.顺序表的定位 Status LocateElem(SqList L) { int e, i = 1; printf("请输入要定位的元素:\n"); scanf("%d",&e); while (i <= L.length&&L.elem[i - 1] != e) { i++; } if (i > L.length) return ERROR; else printf("要定位的元素的位序为%d\n",i); return i; } //8.返回前驱 Status PriorElem(SqList L) { int cur_e, pre_e, i = 1; int *p; p = L.elem + 1;//将第二个元素的地址赋值给p printf("请输入顺序表中第二到表尾的任何一个数:\n"); scanf("%d",&cur_e); while(i < L.length && compare(cur_e, L.elem[i - 1])) { p++; i++; } if (i > L.length) return ERROR; else { pre_e = L.elem[i]; //注意i printf("它的前驱元素是%d\n",pre_e); return pre_e;//将此元素返回给要调用的函数 } } //9.返回后继 Status NextElem(SqList L) { int cur_e, next_e, i = 0;//i的初值是第一个元素的位序 printf("请输入第一到倒数第二个任意一个元素:\n"); scanf("%d",&cur_e); int *p = L.elem;//第一个元素的地址赋值给p while (i < L.length && !compare(cur_e, L.elem[i])) { p++; i++; } if (i == L.length) { return ERROR; } else { next_e = *(++p); printf("它的后继元素是%d\n",next_e); return next_e;//将此元素返回给主函数 } } //10.插入元素 Status ListInsert(SqList &L) { ElemType *p, *q, *newbase; int i, e;//在位置i插入元素e printf("请输入要插入的元素的位置i:\n"); scanf("%d",&i); printf("请输入要插入的元素的数值e:\n"); scanf("%d",&e); if (i<1 || i>L.length) return ERROR; if(L.length>=L.listsize) { if (!(newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)))) exit(0);//分配存储空间失败 L.elem = newbase;//新基址 L.listsize += LISTINCREMENT;//增加存储容量 } q = L.elem + i - 1;//q为插入位置 for (p = L.elem + L.length - 1; p >= q; --p) { *(p + 1) = *p;//给插入位置之后的元素赋值达到之后元素后移一位的效果 } *q = e;//插入e ++L.length; return OK; } //11.删除元素 Status ListDelete(SqList &L) { int i,e; printf("请输入要删除的元素的位置i:\n"); scanf("%d",&i); if (i<1 || i>L.length)//i值不合法 return ERROR; ElemType *p, *q; p = L.elem + i - 1;//p为被删除元素的位置 e = *p; //被删除元素的值赋给e printf("被删除的元素是%d\n",e); q = L.elem + L.length - 1;//q是表尾元素的位置 p = p + 1; for ( ; p <= q; p++) *(p - 1) = *p; L.length--; //表长减一 return OK; } //12.遍历 Status ListTraverse(SqList L) { ElemType *p = L.elem; int i; for (i = 1; i <= L.length; i++) printf("%d ",*p++); printf("\n"); return OK; } int main() { int m,n; SqList L; InitList(L); printf("……顺序表初始化……\n"); printf("请输入顺序表的长度n:\n"); scanf("%d",&n); for (m = 1; m <= n; m++) { printf("请输入第%d个元素的值:\n",m); scanf("%d",&L.elem[m-1]); L.length++; } printf("顺序表的长度为%d\n",L.length); printf("顺序表中的元素为:\n"); ListTraverse(L); printf("…………判断顺序表是否空表…………\n"); if (ListEmpty(L) == 1) printf("顺序表非空\n"); else printf("顺序表为空\n"); printf("…………顺序表中取元素操作…………\n"); GetElem(L); printf("…………顺序表中元素的定位…………\n"); LocateElem(L); printf("…………顺序表中元素的前驱…………\n"); PriorElem(L); printf("…………顺序表中元素的后继…………\n"); NextElem(L); printf("…………顺序表元素插入测试…………\n"); ListInsert(L); printf("此时顺序表中的元素为:\n"); ListTraverse(L); printf("…………顺序表元素删除测试…………\n"); ListDelete(L); printf("此时顺序表中的元素为:\n"); ListTraverse(L); printf("恭喜您成功完成顺序表的所有功能!!!!\n"); return 0; }
相关文章推荐
- 顺序栈的基本操作实现
- 13数组实现顺序堆栈的基本操作
- 顺序表的基本操作——C++实现
- 顺序队列的基本操作实现c++
- 编程实现顺序表的基本操作
- 顺序表的基本操作用C 语言实现
- 用顺序栈实现栈的基本操作
- 数据结构-顺序线性表基本操作实现
- 数据结构C语言实现线性表(顺序实现)的初始化与基本操作
- 顺序表的基本操作——静态实现
- 二叉树基本操作实现(二叉树的顺序存储)
- 顺序表中基本操作的实现
- 顺序栈的基本操作实现
- c语言:顺序表的实现(一) 创建,插入,删除,查找,输出等基本操作实现
- 顺序栈的基本操作实现
- 线性表之顺序表基本操作实现
- c语言实现顺序表的基本操作
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
- c语言:定长顺序串的基本操作实实现
- C语言实现顺序表的插入、删除、查找、遍历等基本操作