数据结构(C语言) - 顺序表的建立、增加、删除、合并

参考《数据结构(C语言版)》 - 严蔚敏 吴伟民 - 清华大学出版社

顺序表的结构定义

typedef struct
{
	ElemType *elem;                          //顺序表始址
	int length;                              //顺序表长度
	int listsize;                            //顺序表空间大小
}SqList;

顺序表的初始化

void InitList_Sq(SqList &L)
{
	L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));   //创建顺序表空间
	if (!L.elem)                      //如果创建失败,则退出程序
		exit(0);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
}

顺序表的增加

void ListInsert_Sq(SqList &L, int i, ElemType e)
{
	if (i < 1 || i > L.length + 1)         //如果插入的位置小于1或大于表长,则不能插入
		return;
	if (L.length >= L.listsize)			  //如果存储长度大于表长,则新建顺序表
	{
		ElemType *newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		                                      //按增量10新建顺序表
		if (!L.elem)
			exit(0);
		L.elem = newbase;			         //始址为新表始址
		L.listsize += LISTINCREMENT;         //空间大小为原大小加上增量
	}
	ElemType *index = &(L.elem[i - 1]);		//插入的位置为index
	for (ElemType *p = &(L.elem[L.length - 1]); p >= index; p--)
		*(p + 1) = *p;		                //插入位置后的元素都往后移一位
	*index = e;								//插入位置放入数据
	L.length++;
}

顺序表的删除

void ListDelete_Sq(SqList &L, int i)
{
	if (i < 1 || i > L.length + 1)
		return;
	ElemType *index = &(L.elem[i - 1]);		//删除位置为index
	ElemType *q = L.elem + L.length - 1;    //删除后的表尾位置为q
	for (++index; index <= q; index++)		//删除位置之后的元素都往前移一位
		*(index - 1) = *index;
	L.length--;
}

顺序表的合并

void MergeList_Sq(SqList La, SqList Lb, SqList &Lc)
{
	ElemType *pa = La.elem; ElemType *pb = Lb.elem;		//两个原表的始址
	Lc.listsize = Lc.length = La.length + Lb.length;	//合并表的空间大小为两个原表的空间大小之和
	ElemType *pc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));
	                                                   //创建合并表空间
	if (!Lc.elem)
		exit(0);
	ElemType *pa_last = La.elem + La.length - 1;	  //两个原表的表尾
	ElemType *pb_last = Lb.elem + Lb.length - 1;
	while (pa <= pa_last && pb <= pb_last)	       //从小到大合并
	{
		if (*pa <= *pb)
			*pc++ = *pa++;
		else
			*pc++ = *pb++;
	}
	while (pa <= pa_last)				//剩余的表元素放入合并表
		*pc++ = *pa++;
	while (pb <= pb_last)
		*pc++ = *pb++;
}

顺序表的展示

void ShowList_Sq(SqList &L)
{
	for (int i = 0; i < L.length; i++)
		printf("%3d", L.elem[i]);
	printf("\n");
}

测试集

表1:1 2 3 4 5 6 7 8 9 10
表1增加第5位,数值为5
表1删去第7位
表2:11 12 13 14 15 16 17 18 19

整体代码

#include<stdio.h>
#include<stdlib.h>

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ElemType int

typedef struct
{
	ElemType *elem;
	int length;
	int listsize;
}SqList;

void InitList_Sq(SqList &L)
{
	L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if (!L.elem)
		exit(0);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
}

void ListInsert_Sq(SqList &L, int i, ElemType e)
{
	if (i < 1 || i > L.length + 1)
		return;
	if (L.length >= L.listsize)
	{
		ElemType *newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if (!L.elem)
			exit(0);
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}
	ElemType *index = &(L.elem[i - 1]);
	for (ElemType *p = &(L.elem[L.length - 1]); p >= index; p--)
		*(p + 1) = *p;
	*index = e;
	L.length++;
}

void ListDelete_Sq(SqList &L, int i)
{
	if (i < 1 || i > L.length + 1)
		return;
	ElemType *index = &(L.elem[i - 1]);
	ElemType *q = L.elem + L.length - 1;
	for (++index; index <= q; index++)
		*(index - 1) = *index;
	L.length--;
}

void MergeList_Sq(SqList La, SqList Lb, SqList &Lc)
{
	ElemType *pa = La.elem; ElemType *pb = Lb.elem;
	Lc.listsize = Lc.length = La.length + Lb.length;
	ElemType *pc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));
	if (!Lc.elem)
		exit(0);
	ElemType *pa_last = La.elem + La.length - 1;
	ElemType *pb_last = Lb.elem + Lb.length - 1;
	while (pa <= pa_last && pb <= pb_last)
	{
		if (*pa <= *pb)
			*pc++ = *pa++;
		else
			*pc++ = *pb++;
	}
	while (pa <= pa_last)
		*pc++ = *pa++;
	while (pb <= pb_last)
		*pc++ = *pb++;
}

void ShowList_Sq(SqList &L)
{
	for (int i = 0; i < L.length; i++)
		printf("%3d", L.elem[i]);
	printf("\n");
}

void main()
{
	SqList L1, L2, L3;
	InitList_Sq(L1); InitList_Sq(L2); InitList_Sq(L3);
	for (int i = 1; i <= 10; i++)
		ListInsert_Sq(L1, i, i);
	ShowList_Sq(L1);
	ListInsert_Sq(L1, 5, 5);
	ShowList_Sq(L1);
	ListDelete_Sq(L1, 7);
	ShowList_Sq(L1);
	for (int j = 11; j < 20; j++)
		ListInsert_Sq(L2, j-10, j);
	ShowList_Sq(L2);
	MergeList_Sq(L1, L2, L3);
	ShowList_Sq(L3);
	system("pause");
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值