线性表顺序存储的基本操作
2017-01-17 13:22
435 查看
/* 线性表的操作主要包括如下几个: 初始化,插入,删除,查找(单个元素所在的位置,某个位置的具体元素,查找所有的元素),判断是否为空,两个线性表合并 */ /// 当需要对线性表进行修改的时候,要传递线性表变量的地址。否则的话,只需要传递传递变量即可 /// 至于原因: 想想当初自定义函数中对两个元素进行交换的实现 #include <stdio.h> #include <string.h> typedef int ElemType; #define MAXSIZE 100 #define OK 1 #define ERROR 0 typedef struct { ElemType elem[MAXSIZE]; int last; } Seqlist; /// 初始化线性表为空 void InitList(Seqlist *L) { memset(L->elem, 0, sizeof(L->elem)); L->last = 0; } /// 返回线性表的长度 /// 如果等于负数,此时没有元素 ElemType ListLength(Seqlist L) { return L.last; } /// 查找元素的位置 /// 查找e,如果能找到则返回当前所处的位置,如果找不到则返回-1 ElemType locate(Seqlist L, ElemType e) { int i = 0; while((i <= L.last) && (L.elem[i] != e)) ++ i; if(i <= L.last) return i + 1; return -1; } /// 插入元素 ElemType InsList(Seqlist *L, int i, ElemType e) { /// 由于是用户输入的,所以从1开始。 /// 插入的位置可能是线性表当前最后一个位置的下一个位置,所以要加2 if(i < 1 || i > L->last + 2) { printf("插入位置不合法!\n"); return ERROR; } if(i == L->last + 1) { L->elem[i - 1] = e; L->last ++; return OK; } int k; for(k = L->last; k >= i - 1; k --) L->elem[k + 1] = L->elem[k]; L->elem[i - 1] = e; L->last ++; return OK; } /// 删除第i位置的元素, 并返回此位置的元素 ElemType DelList(Seqlist *L, int i, ElemType *e) { if(i < 1 || i > L->last) { printf("删除位置不合法!\n"); return ERROR; } /// 获取要删除的元素 *e = L->elem[i - 1]; int k; for(k = i; k <= L->last; k ++) L->elem[k - 1] = L->elem[k]; L->last --; return OK; } /// 获取线性表中的数据 void GetData(Seqlist L, int i = -1) { /// 获取所有的元素 if(i == -1) { printf("所有的元素如下所示:\n"); int k; for(k = 1; k <= L.last; k ++) printf("%d ", L.elem[k - 1]); printf("\n"); return; } /// 否则的话,获取指定位置的元素 printf("当前位置的元素为:%d\n",L.elem[i - 1]); return; } /// 判断线性表是否为空,如果为空的话,则返回1 ElemType EmptyList(Seqlist L) { if(L.last == 0) return OK; return ERROR; } /// 清空线性表 void ClearList(Seqlist *L) { memset(L->elem, 0, sizeof(L->elem)); L->last = 0; } ///线性表的合并操作, 两者都含有的元素只记录一次 void MergeList(Seqlist L1, Seqlist L2, Seqlist *L3) { int i = 0, j = 0, k = 0; for(i = 1;i <= L1.last;i ++) L3->elem[i - 1] = L1.elem[i - 1]; L3->last = k = L1.last; for(i = 1;i <= L2.last; i ++) { bool flag = 0; for(j = 1; j <= k; j ++) if(L3->elem[j - 1] == L2.elem[i - 1]) { flag = 1; break; } /// 如果已经出现过则不记录,没出现过则记录 if(flag == 0) { L3->elem[L3->last] = L2.elem[i -1]; L3->last ++; } } } int main() { Seqlist L; InitList(&L); ElemType e; int i; for(i = 0; i < 10; i ++) InsList(&L, i + 1, i); printf("当前线性表的长度为:%d\n", ListLength(L)); ///查找所有的元素 GetData(L); ///查找指定位置上的元素 GetData(L, 3); ///删除指定位置的元素 ElemType flag = DelList(&L, 7, &e); if(flag == 1) { printf("删除成功!\n"); printf("删除的元素为:%d\n", e); } printf("当前线性表的长度为:%d\n", ListLength(L)); GetData(L); /// 查找指定元素所在的位置 flag = locate(L, 7); if(flag == -1) printf("指定的元素不存在!\n"); else printf("指定元素所在的位置为:%d\n", flag); flag = EmptyList(L); if(flag == 0) printf("线性表不为空!\n"); else printf("线性表为空\n"); ClearList(&L); /// 对两个线性表进行合并的操作 Seqlist L1, L2, L3; InitList(&L1); InitList(&L2); InitList(&L3); printf("此时线性表L3的长度为%d\n", L3.last); for(i = 0;i < 10; i ++) InsList(&L1, i + 1, i); int j = 0; for(int i = 0;i < 20;i ++) InsList(&L2, ++ j, i); MergeList(L1, L2, &L3); printf("此时线性表L3的长度为%d\n", L3.last); GetData(L3); return 0; }
相关文章推荐
- Linux C函数参考手册(PDF版)
- C#数据结构之顺序表(SeqList)实例详解
- C# partial关键字说明
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- Lua教程(七):数据结构详解
- C#用链式方法表达循环嵌套
- C#两个相同属性的类赋值方法
- C#中const 和 readonly 修饰符的用法详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- C#中的委托数据类型简介
- C#编写的艺术字类实例代码
- C#实现打造气泡屏幕保护效果
- 基于C#技术实现身份证识别功能
- 举例讲解C#编程中委托的实例化使用
- 使用C#代码获取存储过程返回值