您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】顺序线性表的插入、删除、合并实现

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: