#include <stdio.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10 //这个是顺序表需要增加的单位长度
void PrintElem(int e) { printf("%d ", e); };
typedef struct {
int* elem; //这是指向这个结构体的指针变量
int length; //这是顺序表的长度
int listsize; //这是顺序表当前分配的大小,比如书里面给的100大小的空间
}SqList;
//顺序表初始化
void InitListSqlist(SqList* L) {
//注意这个函数参数的位置,这里可以写成SqList *L,下面必须写成L->elem或者(*L).elem,
//如果是Sqlist &L 下面写的形式是L.elem(*L 表示的是指针,而&L是引用
L->elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));
if (!(L->elem)) {
return;
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
}
//某个位置插入一个数
void InsertSqlist(SqList* L, int i, int e) {
//在顺序表1-n的i位置之前插入一个数e
int* newbase, * p, * q;
if (i<1 || i>(L->length) + 1) return;
if ((L->length) >= (L->listsize)) {
//如果插入的数据过大,超过顺序表当前大小
//需要重新开辟空间
//这里用realloc 是表明在谁基础上再改变内存
//newbase是一个新的地址
newbase = (int*)realloc((L->elem), (L->listsize + LISTINCREMENT) * sizeof(int));
if (!newbase) return; //如果不是这个,返回
L->elem = newbase; //把这个新的地址分给elem
L->listsize += LISTINCREMENT; //容量增加
}
q = &(L->elem[i - 1]); //q表示数据e insert的位置
for (p = &((*L).elem[(*L).length - 1]); p >= q; --p)
*(p + 1) = *p; //实现右移
*q = e; //这里说明一下 ( * &q)就是表示本身的数据
(*L).length++;
}
//获取顺序表长度
int ListLengthSqlist(SqList L)
{
return L.length;
}
void GetElemSqlist(SqList L, int i, int* e) {
if (i<1 || i>L.length) return;
else *e = L.elem[i - 1];
}
//定位函数
int LocateElemSqlist(SqList L, int e, int(Compare)(int, int))
{
int i = 1; //i的初值为第一个元素的位序
while (i <= L.length && !Compare(e, L.elem[i - 1]))
++i;
if (i <= L.length)
return i;
else
return 0;
}
int EqualSqlist(int e1, int e2)
{
return e1 == e2 ? true : false;
}
//合并表a和b到a
void UnionSqlist(SqList* La, SqList Lb)
{
int La_len, Lb_len;
int i;
int e;
La_len = ListLengthSqlist(*La);
Lb_len = ListLengthSqlist(Lb);
for (i = 1; i <= Lb_len; i++)
{
GetElemSqlist(Lb, i, &e);
if (!LocateElemSqlist(*La, e, EqualSqlist)) //如果la不存在e,合并
InsertSqlist(La, ++La_len, e);
}
}
//输出表
void ReverseSqlist(SqList L, void(Visit)(int))
{
int i;
cout<<"{";
for (i = 0; i < L.length; i++) {
Visit(L.elem[i]);
}
cout<<"}";
}
//对表进行排序
void SortSqlist(SqList* L)
{
int i, j, k, temp;
//temp=L->elem[0];
for (i = 1; i < L->length; i++)
{
temp = L->elem[i]; //待插入元素提取出来
for (j = i - 1; j >= 0 && L->elem[j] > temp; j--) //若待插入元素比有序序列中比较元素小,就将该比较元素后移一位
{
L->elem[j + 1] = L->elem[j];
}
L->elem[j + 1] = temp; //实现待插入元素插入
for (k = 0; k < L->length; k++) //打印一趟排序
cout<< L->elem[k] ;
cout << endl;
}
}
//复制表b到a
void CopySqlist(SqList* a, SqList* b)
{
int i, x;
for (i = 0; i < b->length; i++)
{
x = b->elem[i];
InsertSqlist(a, i+1, x);
}
}
//test
int main() {
SqList La, Lb,Lc;
int i;
int n, m;
InitListSqlist(&La);
cout << "输入表a的长:";
cin >> n;
cout << endl;
cout << "输入表a的值: " << endl;
for (i = 1; i <= n; i++) {
int n;
cin >> n;
InsertSqlist(&La, i,n);
}
InitListSqlist(&Lb);
cout << "输入表b的长:";
cin >> m;
cout << endl;
cout<<"输入表b的值: " << endl;
for (i = 1; i <= m; i++) {
int m;
cin >> m;
InsertSqlist(&Lb, i, m);
}
InitListSqlist(&Lc);
CopySqlist(&Lc, &La);
UnionSqlist(&La, Lb);
SortSqlist(&La);
cout << "输出表a:" << endl;
ReverseSqlist(La, PrintElem);
cout << endl;
cout << "输出原表a:" << endl;
ReverseSqlist(Lc, PrintElem);
cout << endl;
cout << "输出表b:" << endl;
ReverseSqlist(Lb, PrintElem);
return 0;
}
实现顺序表的合并,逆置,复制,排序,插入等