写一段代码完成线性表的基本操作,插入、删除、查找,遍历、以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。
时间: 2024-06-06 17:06:17 浏览: 80
数据结构对元素类型为整型的顺序存储的线性表进行插入、删除和查找操作.doc
好的,以下是基于顺序存储结构和链接存储结构的线性表基本操作代码示例:
顺序存储结构:
#define MaxSize 100 // 线性表容量
typedef struct {
int data[MaxSize]; // 存放线性表元素
int length; // 当前长度
} SqList;
// 插入操作
bool ListInsert(SqList &L, int i, int e) {
if (i < 1 || i > L.length + 1) { // 判断位置是否合法
return false;
}
if (L.length >= MaxSize) { // 判断线性表是否已满
return false;
}
for (int j = L.length; j >= i; j--) { // 将i及之后的元素后移
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e; // 插入新元素
L.length++; // 长度+1
return true;
}
// 删除操作
bool ListDelete(SqList &L, int i, int &e) {
if (i < 1 || i > L.length) { // 判断位置是否合法
return false;
}
e = L.data[i - 1]; // 获取要删除的元素
for (int j = i; j < L.length; j++) { // 将i之后的元素前移
L.data[j - 1] = L.data[j];
}
L.length--; // 长度-1
return true;
}
// 查找操作
int LocateElem(SqList L, int e) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e) { // 找到元素
return i + 1; // 返回位置
}
}
return 0; // 未找到
}
// 遍历操作
void ListTraverse(SqList L) {
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
// 线性表合并
SqList MergeList(SqList La, SqList Lb) {
SqList Lc;
int i = 0, j = 0, k = 0;
while (i < La.length && j < Lb.length) { // 依次取出La和Lb的元素
if (La.data[i] <= Lb.data[j]) {
Lc.data[k++] = La.data[i++];
} else {
Lc.data[k++] = Lb.data[j++];
}
}
while (i < La.length) { // 将La的剩余元素放入Lc中
Lc.data[k++] = La.data[i++];
}
while (j < Lb.length) { // 将Lb的剩余元素放入Lc中
Lc.data[k++] = Lb.data[j++];
}
Lc.length = k; // 更新Lc的长度
return Lc;
}
链接存储结构:
typedef struct LNode {
int data; // 存放线性表元素
struct LNode *next; // 指向下一个结点
} LNode, *LinkList;
// 插入操作
bool ListInsert(LinkList &L, int i, int e) {
if (i < 1) { // 位置不合法
return false;
}
LNode *p = L, *q; // p指向头结点
int j = 0;
while (p && j < i - 1) { // 寻找第i-1个结点
p = p->next;
j++;
}
if (!p) { // 不存在第i-1个结点
return false;
}
q = new LNode; // 申请新结点
q->data = e;
q->next = p->next; // 插入新结点
p->next = q;
return true;
}
// 删除操作
bool ListDelete(LinkList &L, int i, int &e) {
if (i < 1) { // 位置不合法
return false;
}
LNode *p = L, *q;
int j = 0;
while (p->next && j < i - 1) { // 寻找第i-1个结点
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) { // 不存在第i个结点
return false;
}
q = p->next; // 删除结点
e = q->data;
p->next = q->next;
delete q;
return true;
}
// 查找操作
int LocateElem(LinkList L, int e) {
LNode *p = L->next;
int i = 1;
while (p) {
if (p->data == e) {
return i;
}
p = p->next;
i++;
}
return 0;
}
// 遍历操作
void ListTraverse(LinkList L) {
LNode *p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 线性表合并
LinkList MergeList(LinkList La, LinkList Lb) {
LNode *pa = La->next, *pb = Lb->next, *pc, *p;
LinkList Lc = new LNode; // 创建新线性表
Lc->next = NULL;
pc = Lc;
while (pa && pb) { // 依次取出La和Lb的元素
if (pa->data <= pb->data) {
p = pa;
pa = pa->next;
} else {
p = pb;
pb = pb->next;
}
pc->next = p; // 插入新元素
pc = p;
}
pc->next = pa ? pa : pb;
return Lc;
}
注意:以上代码仅为示例,具体实现可能存在细节问题。另外,本人是AI语言模型,对代码实现有一定局限性,如有问题还请见谅。
阅读全文