顺序线性表的功能
//头文件
#pragma once
#define LIST_INIT_SIZE 50
#define LIST_INCREMENT 20
#define OK 1
#define ERROR 0
typedef int Status;
typedef char ElemType;
typedef struct list_ {
ElemType* elem;
int length;
int listize;
}SqList;
// 1 初始化 函数
Status InitList_Sq(SqList& L);
//2 想第i个位置插入数据
Status ListInsert_Sq(SqList& L, int i, ElemType e);
//3 显示所有元素
void PrintAll(SqList L, void print(ElemType));
//4 获取第i个元素的值
Status GetElem(SqList L, int i, ElemType& e);
//5 打印一个元素
void PrintOne(ElemType e);
//删除 第i个位置的元素
Status ListDelete(SqList& L, int i, ElemType& e);
// 用完释放
void DestroyList(SqList& L);
//获取e所在下标
size_t LocateElem(SqList L,ElemType e);
#include <stdio.h>
#include <stdlib.h>
#include "mylist.h"
Status InitList_Sq(SqList& L) {
L.elem = (ElemType*)malloc(sizeof(ElemType) * LIST_INIT_SIZE);
if (!L.elem)
return ERROR;
L.length = 0;
L.listize = LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq(SqList& L, int i, ElemType e) {
// i必须大于0 ,小于等于 L.length + 1
if (i<1 || i> L.length + 1)
return ERROR;
// 位置合理,空间不够
if (L.length >= L.listize) {//扩空间
ElemType* newbase = (ElemType*)realloc(L.elem, sizeof(ElemType) * (L.listize + LIST_INCREMENT));
if (!newbase)
exit(-1);
L.elem = newbase;
L.listize += LIST_INCREMENT;
}
ElemType* p;
p = L.elem + (i - 1);
p = &(L.elem[i - 1]);
for (ElemType* q = L.elem + (L.length - 1); q >= p; q--)
*(q + 1) = *q;
*p = e;
L.length += 1;
return OK;
}
void PrintAll(SqList L, void print(ElemType)) {
for (size_t i = 0; i < L.length; i++) {
print(L.elem[i]);
}
printf("\n");
}
Status GetElem(SqList L, int i, ElemType& e) {
// i必须大于0 ,小于等于 L.length
if (i<1 || i> L.length)
return ERROR;
e = L.elem[i - 1]; //e = *(L.elem + i - 1);
return OK;
}
void PrintOne(ElemType e) {
printf("%d ", e);
}
Status ListDelete(SqList& L, int i, ElemType& e) {
// i必须大于0 ,小于等于 L.length
if (i<1 || i> L.length)
return ERROR;
e = L.elem[i - 1]; //e = *(L.elem + i - 1);
for (ElemType* p = L.elem + i - 1; p < L.elem + L.length; p++)
*p = *(p + 1);
L.length--;
return OK;
}
void DestroyList(SqList& L) {
free(L.elem);
L.length = 0;
L.listize = 0;
}
size_t LocateElem(SqList L, ElemType e){
for (size_t i = 0; i < L.length; i++) {
if (L.elem[i] == e) {
return i + 1;
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "mylist.h"
// a = a U b
void unionSet(SqList& a, SqList b);
void unionSet(SqList& a, SqList b) {
//遍历b
for (size_t i = 1; i <= b.length; i++) {//i代表位置,并非下标(从1开始),length不代表下标
ElemType e;
GetElem(b, i,e);
//询问 e 是否在 a集合
if (!LocateElem(a, e)) {
ListInsert_Sq(a, a.length+1, e);
}
}
}
int main() {//2024-5-5
SqList a, b;
InitList_Sq(a);
InitList_Sq(b);
ListInsert_Sq(a, 1, 1);
ListInsert_Sq(a, 2, 2);
ListInsert_Sq(a, 3, 3);
ListInsert_Sq(a, 4, 4);
ListInsert_Sq(a, 5, 5);
ListInsert_Sq(b, 1, 1);
ListInsert_Sq(b, 2, 3);
ListInsert_Sq(b, 3, 9);
ListInsert_Sq(b, 4, 10);
puts("A原来:");
PrintAll(a,PrintOne);
puts("B原来:");
PrintAll(b, PrintOne);
unionSet(a,b);
puts("A现在:");
PrintAll(a, PrintOne);
return 0;
}
int main1() { //2024-5-4
SqList L;
if (!InitList_Sq(L)) {
printf("线性表建立失败,程序退出。");
exit(-1);
}
ListInsert_Sq(L,1,100);
ListInsert_Sq(L, 2, 101);
ListInsert_Sq(L, 3, 102);
ListInsert_Sq(L, 4, 103);
ListInsert_Sq(L, 5, 104);
ListInsert_Sq(L, 6, 105);
ListInsert_Sq(L, 7, 106);
PrintAll(L,PrintOne);
char e;
GetElem(L, 2,e);
PrintOne(e);
printf("\n");
ListDelete(L,2,e);
puts("现在的列表:");
PrintAll(L,PrintOne);
printf("刚才删除的元素是:\n");
PrintOne(e);
printf("\n");
return 0;
}