C语言顺序表的实现
来源:互联网 发布:qqgame for mac 编辑:程序博客网 时间:2024/06/17 20:39
顺序表的操作有初始化、插入元素、取值、查找元素、删除元素这五种操作。下面根据个人在严蔚敏老师的《数据结构(C语言版)(第2版)》中的了解来说明一下。
在初始化之前,我们先设置宏定义和类型定义:
#define OK1#define ERROR 0#define OVERFLOW -2#define MAXSIZE 100typedef intStatus;typedef int ElemType;typedefstruct{ ElemType *elem; int length;}SqList;
下面是初始化:
Status InintList(SqList*L){ (*L).elem = (ElemType*)malloc(MAXSIZE*sizeof(ElemType)); if (!(*L).elem) { exit(OVERFLOW); } (*L).length = 0; return OK;}
用malloc()为顺序表L分配足够的空间长度,由于malloc()分配空间成功的话会返回一个地址,而失败的话会返回NULL,所以使用if(!(*L).elem)判断分配是否成功,如果分配失败,则返回OVERFLOW。并将顺序表长度初始化为0。
插入元素:
Status ListInsert(SqList*L, int i, ElemType e){ if ((i<1) ||(i>(*L).length+1)) returnERROR; if ((*L).length == MAXSIZE) returnERROR; for (int j = (*L).length - 1; j > i - 1;j--) { (*L).elem[j + 1] = (*L).elem[j]; } (*L).elem[i - 1] = e; ++(*L).length; return OK;}
要在i个位置插入元素,先把i之后的元素都后移一位,移完后长度+1。但必须先判断第i个位置是否在顺序表中与其他元素相连的位置和顺序表是否会溢出。
取值:
Status GetElem(SqList L,int i,ElemType *e){ if (i<1 || i>(L.length)) returnERROR; *e = L.elem[i - 1]; return OK;}
查找:
int LocateElem(SqList L,ElemType e){ int i; for (i = 0; i < L.length;i++) { if(L.elem[i] == e) return i+1; } return 0;}
取值和查找这一部分个人觉得还是比较简单的,这里就不啰嗦了。
删除元素:
Status ListDelete(SqList*L, int i){ if (i<1 ||i>(*L).length) returnERROR; for (int j = i; j < (*L).length;j++) { (*L).elem[j-1] = (*L).elem[j]; } --(*L).length; return OK;}
要删除i位置的元素,需要先判断i元素是否在顺序表内。并把i元素之后的元素前移一位,最后把顺序表的长度减1就行了。
加入main()测试:
int main(void){ int n,m; int i; int a, *e; SqList L; e = &a; printf("1.初始化顺序表\n2.取值\n3.查找元素\n4.插入元素\n5.删除元素\n6.退出\n"); while (1) { scanf("%d", &n); if (n<1|| n>6) { printf("输入错误!\n"); } else { switch (n) { case 1: if (InintList(&L) == OK) printf("初始化成功\n"); else printf("初始化失败\n"); break; case 2: printf("输入你要取值的序号:"); scanf("%d", &i); if (GetElem(L, i, e) == OK) printf("你要取得值为:%d\n", *e); else printf("取值失败!"); break; case 3: printf("输入你要查找的元素:"); scanf("%d", &a); if ((m = LocateElem(L, a)) !=ERROR) printf("%d\n", m); else printf("查找失败\n"); break; case 4: printf("输入你要插入的位置和元素:"); scanf("%d %d", &i,&a); if (ListInsert(&L, i, a) ==OK) printf("插入成功!\n"); else printf("插入失败!\n"); break; case 5: printf("输入你要删除的元素序号:"); scanf("%d", &i); if (ListDelete(&L, i) ==OK) printf("删除成功!\n"); else printf("删除失败!\n"); break; case 6: exit(0); } } } return 0;}
现在就可以选择对顺序表进行初始化、插入、取值、查询、删除的操作了。
0 0
- 线性表的顺序实现(C语言)
- 顺序表的C语言实现
- 线性表的顺序实现(c语言)
- 顺序表的实现(C语言)
- [c语言]数据结构 顺序表的实现
- 顺序表的C语言实现
- c语言中顺序表的实现
- 顺序表的C语言实现
- C语言顺序表的简单实现
- C语言顺序表的实现
- C语言顺序表的实现
- c语言顺序表的实现
- C语言动态顺序表的实现
- C语言静态顺序表的实现
- 顺序表的实现(C语言)
- c语言动态顺序表的实现
- 【C语言】动态顺序表的实现
- c语言顺序表的实现
- WPS无法保存或创建此文件
- error C2629: unexpected \'class Date (\'
- java实现图片的旋转顺带跟换背景色
- 用户注册表使用的内存没有被释放。
- 【转载】CRichEditCtrl类的LineLength方法的正确使用
- C语言顺序表的实现
- firefox NPAPI 插件开发(c++)(二)-为插件添加和脚本交互的能力(转载)
- C语言单链表基本操作
- 使用单文档视图结构把Word嵌入到VC程序中(2)
- C语言链栈的基本操作
- Longest Consecutive Sequence
- 【转载】Sql server 2005使用OSQL连接出错
- C语言顺序栈的基本操作
- 洛谷 1984 烧水问题