参考《数据结构(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");
}