【数据结构】顺序线性表的插入、删除、合并实现
2015-11-13 21:35
766 查看
<span style="font-size:24px;">线性表分为<span style="color:#3366ff;"><strong>顺序线性表</strong></span>和<span style="color:#ff0000;"><strong>链式线性表</strong></span></span>
顺序线性表:
链式线性表:
线性表的特点是:
存在唯一的一个被称做“第一个”元素的数据元素
存在唯一的一个被称做“最后一个”的数据元素
除第一个之外,集合中的每个数据元素均只有一个前驱
除最后一个之外,集合中每个数据元素均只有一个后继
线性表:是n个数据元素的有限序列,线性表中元素的个数n(n>=0)定义为线性表的长度,n=0时称为空表,在非空表中每个数据元素有一个确定的位置,比如就是第二个元素,是第i个元素,i称为在线性表的位序。线性表非常灵活,长度可以根据需要增加或缩短,也可以对元素直接访问,也可以插入、删除元素等。
顺序表:线性表的顺序表示,用一组地址连续的存储单元依次存储线性表的顺序元素。
本文只对顺序表实现做分析实现,链式实现见下章节。
假设每一个元素占s个字节,第一个元素的存储地址LOC(a1)作为顺序表的起始地址,第i个元素的存储位置为:
LOC(ai) = LOC(a1) + (i-1)*s
顺序表的操作主要分为线性表的初始化,插入元素,删除元素,合并线性表。此处只做算法分析。
1、插入元素
确定插入位置:
将要插入位置后的元素后移一位:
插入该元素:
2、删除元素
确定删除位置:
去除要删除的元素:
删除元素后面的元素前移一位:
3、合并线性表
L1中第一个元素和L2中第一个元素比较,如果L1的元素比L2元素小,则将L1中第一个元素插入L3中,将L1指针指向下一个元素;如果L1的元素比L2元素大,将L2中第一个元素插入L3中,将L2指针指向下一个元素;依次循环,直到合并完成。
实现代码如下:
<span style="color:#3366ff;">/*list.h*/ #ifndef __LIST_H__ #define __LIST_H__ #define LIST_LENGHT 10 #define ADD_LENGHT 5 typedef struct { int * Elem; int lenght;//当前长度 int listsize;//当前的分配存储容量 }List; bool Initlist(List &list); bool Insertlist(List &list, int i, int value); bool Deletelist(List &list, int i, int &value); bool Unionlist(List list1, List list2, List &list3); void display(List list); #endif</span>
<span style="color:#3366ff;">/*list.cpp*/ #include <stdio.h> #include <stdlib.h> #include "list.h" bool Initlist(List &list) { list.Elem = (int *)malloc(sizeof(int) * LIST_LENGHT); if(!list.Elem) { printf("Initlist1 failure!\n"); return false; } list.lenght = 0; list.listsize = LIST_LENGHT; return true; } bool Insertlist(List &list, int i, int value) { if(i<1 || i>list.lenght+1)//插入位置不正确 { printf(" 插入位置不正确,请确认!\n按Enter退出:"); getchar(); return false; } if(list.lenght == list.listsize)//如果线性表满了,需要添加空间 { list.Elem = (int *)realloc(list.Elem, sizeof(int)*(list.listsize + ADD_LENGHT)); if(!list.Elem) { printf("Realloc failure!\n"); return false; } list.listsize = list.listsize + ADD_LENGHT; } //将要插入的位置之后的所有元素向后移动一位 for(int j=list.lenght; j>=i; j--) list.Elem[j] = list.Elem[j-1]; //插入该元素 list.Elem[i-1] = value; list.lenght++; return true; } bool Deletelist(List &list, int i, int &value) { if(i<1 || i>list.lenght) { printf(" 插入位置不正确,请确认!\n按Enter退出:"); getchar(); return false; } value = list.Elem[i-1]; for(int j=i-1; j<list.lenght-1; j++) list.Elem[j] = list.Elem[j+1]; list.lenght --; return true; }</span> <span style="color:#3366ff;"> bool Unionlist(List list1, List list2, List &list3) { while(list1.lenght + list2.lenght > list3.listsize) { list3.Elem = (int *)realloc(list3.Elem, sizeof(int)*(list3.listsize +ADD_LENGHT)); if(!list3.Elem) { printf("Realloc2 failure!\n"); return false; } list3.listsize = list3.listsize + ADD_LENGHT; } int i = 0, j = 0, k = 0; while(i < list1.lenght && j < list2.lenght) { if(list1.Elem[i] < list2.Elem[j]) { k++; Insertlist(list3, k, list1.Elem[i]); i++; } else { k++; Insertlist(list3, k, list2.Elem[j]); j++; } } while(i<list1.lenght) { k++; Insertlist(list3, k, list1.Elem[i]); i++; } while(j<list2.lenght) { k++; Insertlist(list3, k, list2.Elem[j]); j++; } return true; } void display(List list) { for(int i=0; i<list.lenght; i++) printf("第 %d 个元素是 %d\n", i+1, list.Elem[i]); }</span>
<span style="color:#3366ff;">/* 本程序完成了线性表的初始化,插入、删除、合并功能 main函数 */ #include <stdio.h> #include <stdlib.h> #include "list.h" int main() { List L1; Initlist(L1); List L2; Initlist(L2); List L3; Initlist(L3); //L1插入元素5 67 8 43,然后删除43 Insertlist(L1, 1, 5); Insertlist(L1, 1, 67); Insertlist(L1, 1, 8); Insertlist(L1, 1, 43); int value; Deletelist(L1, 1, value); printf("删除的值是%d\n", value); printf("\n线性表L1:\n"); display(L1); //L2插入元素55 63 3 , Insertlist(L2, 1, 55); Insertlist(L2, 1, 63); Insertlist(L2, 1, 3); printf("\n线性表L2:\n"); display(L2); printf("\n合并L1,L2的线性表L3:\n"); Unionlist(L1, L2, L3); display(L3); getchar(); return 0; }</span>
结果如下:
<span style="color:#3366ff;">删除的值是43 线性表L1: 第 1 个元素是 8 第 2 个元素是 67 第 3 个元素是 5 线性表L2: 第 1 个元素是 3 第 2 个元素是 63 第 3 个元素是 55 合并L1,L2的线性表L3: 第 1 个元素是 3 第 2 个元素是 8 第 3 个元素是 63 第 4 个元素是 55 第 5 个元素是 67 第 6 个元素是 5</span>
相关文章推荐
- 数据结构之堆
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构小练
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之二叉树的建立与遍历
- 数据结构实验之队列一:排队买饭
- 数据结构实验之栈四:括号匹配
- 数据结构实验之栈三:后缀式求值
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈一:进制转换
- 【数据结构】二叉树
- 【数据结构】二叉树
- binder驱动使用的数据结构说明
- 2015年大二上-数据结构-栈(4)- 数制转换
- 数据结构实验之链表六:有序链表的建立
- 数据结构实验之链表五:单链表的拆分
- 2015年大二上-数据结构-栈(3)- 括号的匹配
- 数据结构上机实验之顺序查找
- 数据结构上机实验之二分查找