#include<stdio.h>
#include<stdlib.h>
//数据类型定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
int * elem;
int length;
int listsize;
}SqList;
//初始化一个新的线性表 1
void InitList(SqList * L){
L -> elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
if(!(L -> elem))
exit(0);
L -> length = 0;
L -> listsize = LIST_INIT_SIZE;
}
//销毁线性表 2
void DestroyList(SqList * L){
free(L -> elem);
L -> elem = NULL;
L -> length = 0;
L -> listsize = 0;
}
//将线性表重置为空表 3
void ClearList(SqList * L){
L -> length = 0;
}
//判空 4
bool ListEmpty(SqList List) {
if (List.length == 0)
return true;
else
return false;
}
//求表长 5
int ListLength(SqList List){
return List.length;
}
//获取第i个元素 6
bool GetElem(SqList List, int i, int * e){
if(List.length == 0 || i < 1 || i > List.length)
return false;
* e = List.elem[i - 1];
return true;
}
//赋值或者修改位序为i的值 7
bool PutElem(SqList * L, int i, int * e){ //i是位序,数组下标加1
if (i > L -> length + 1)
return false;
if (i < 1)
return false;
if (i < L -> length + 1)
L -> elem[i - 1] = * e;
if (i = L -> length + 1){
if (L -> length == L -> listsize){
int * newbase = (int *)realloc(L -> elem, (L -> listsize + LISTINCREMENT) * sizeof(int));
if(!(L -> elem))
exit(0);
L -> elem = newbase;
L -> listsize = L -> listsize + LISTINCREMENT;
L -> elem[i - 1] = * e;
}
else
L -> elem[i - 1] = * e;
L -> length = L -> length +1;
}
return true;
}
bool compare(int e, int f){
if (e == f)
return true;
else
return false;
}
//求特定元素位序 8
int LocateElem(SqList List, int e, bool (*compare)(int, int)){
if(List.length == 0)
return -1;
for (int i = 0; i < List.length; i++)
if ((*compare)(List.elem[i], e))
return i + 1;
return 0;
}
//求前驱结点 9
bool PriorElem(SqList List, int cur_e, int * pre_e){
if(List.length <= 1)
return false;
int i = LocateElem(List, cur_e, compare);
if (i <= 1)
return false;
* pre_e = List.elem[i - 2];
return true;
}
//求后继结点 10
bool NextElem(SqList List, int cur_e, int * next_e){
if(List.length <= 1)
return false;
int i = LocateElem(List, cur_e, compare);
if (i == List.length || i < 1)
return false;
* next_e = List.elem[i];
return true;
}
bool visit(int * x){
printf("%d\n", * x);
return true;
}
//遍历线性表 11
bool ListTraverse(SqList List, bool (*visit)(int * x)){ //函数做参数
bool flag;
if(List.length == 0)
return false;
for (int i = 0; i < List.length; i++){
flag = (*visit)(& List.elem[i]);
if (flag == false)
break;
}
return flag;
}
//在第i个元素前插入元素 12
bool ListInsert(SqList * L, int i, int e){
if (i < 1 || i > L -> length + 1)
return false;
if (L -> length == L -> listsize){
int * newbase = (int *)realloc(L -> elem, (L -> listsize + LISTINCREMENT) * sizeof(int));
if(!(L -> elem))
exit(0);
L -> elem = newbase;
L -> listsize = L -> listsize + LISTINCREMENT;
}
for (int j = L -> length - 1; j >= i - 1; j--)
L -> elem[j + 1] = L -> elem[j];
L -> elem[i - 1] = e;
L -> length = L -> length + 1;
return true;
}
//删除第i个元素 13
bool ListDelete(SqList * L, int i, int * e){
if (i < 1 || i > L -> length)
return false;
* e = L -> elem[i - 1];
for (int j = i - 1; j <= L -> length - 2; j++)
L -> elem[j] = L -> elem[j + 1];
L -> length = L -> length - 1;
return true;
}
//示例一 合并两个线性表
void Union(SqList * La, SqList Lb){
int a;
for (int i = 0; i < Lb.length; i++){
a = LocateElem(* La, Lb.elem[i], compare);
if (a == 0)
ListInsert(La, La -> length + 1, Lb.elem[i]);
}
}
//示例二 有序表合并
void MergeList(SqList La, SqList Lb, SqList * Lc){
int i = 0, j = 0, k = 0;
while(i < La.length && j < Lb.length){
if(La.elem[i] < Lb.elem[j]){
ListInsert(Lc, k+1, La.elem[i]);
i++;
k++;
}
else{
ListInsert(Lc, k+1, Lb.elem[j]);
j++;
k++;
}
}
while(i < La.length){
ListInsert(Lc, k+1, La.elem[i]);
i++;
k++;
}
while(j < Lb.length){
ListInsert(Lc, k+1, Lb.elem[j]);
j++;
k++;
}
}
int main(){
SqList La, Lb, Lc;
SqList *PLa = &La;
SqList *PLb = &Lb;
SqList *PLc = &Lc;
InitList(PLa);
InitList(PLb);
InitList(PLc);
ListInsert(PLa, 1, 11);
ListInsert(PLa, 2, 33);
ListInsert(PLb, 1, 22);
ListInsert(PLb, 2, 33);
//ListInsert(PLb, 3, 44);
//Union(PLa,Lb);
ListTraverse(La,visit);
MergeList(La, Lb, PLc);
ListTraverse(Lc,visit);
return 0;
}