写一个代码 线性表顺序存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、两个非递减有序线性表的归并等)的C语言版代码:
时间: 2024-06-05 13:05:58 浏览: 112
数据结构C严蔚敏版_全注释源码_线性表队列栈监视哨查找折半直接插入排序冒泡快速选择
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 线性表的最大长度
typedef struct {
int data[MAXSIZE]; // 存储元素的数组
int length; // 线性表的当前长度
} SqList; // 顺序存储结构的线性表
// 初始化线性表
void InitList(SqList *L) {
L->length = 0;
}
// 赋值操作
void ListInsert(SqList *L, int pos, int value) {
// 判断插入位置是否合法
if (pos < 1 || pos > L->length + 1) {
printf("插入位置不合法!\n");
return;
}
// 判断线性表是否已满
if (L->length == MAXSIZE) {
printf("线性表已满!\n");
return;
}
// 将插入位置之后的元素依次后移
for (int i = L->length; i >= pos; i--) {
L->data[i] = L->data[i - 1];
}
// 插入新元素
L->data[pos - 1] = value;
// 线性表长度加1
L->length++;
}
// 取值操作
int ListGet(SqList *L, int pos) {
// 判断取值位置是否合法
if (pos < 1 || pos > L->length) {
printf("取值位置不合法!\n");
return -1;
}
return L->data[pos - 1];
}
// 删除操作
void ListDelete(SqList *L, int pos) {
// 判断删除位置是否合法
if (pos < 1 || pos > L->length) {
printf("删除位置不合法!\n");
return;
}
// 将删除位置之后的元素依次前移
for (int i = pos - 1; i < L->length - 1; i++) {
L->data[i] = L->data[i + 1];
}
// 线性表长度减1
L->length--;
}
// 归并操作
void MergeList(SqList *L1, SqList *L2, SqList *L3) {
int i = 0, j = 0, k = 0; // i、j、k分别表示L1、L2、L3的下标
while (i < L1->length && j < L2->length) {
if (L1->data[i] <= L2->data[j]) {
L3->data[k++] = L1->data[i++];
} else {
L3->data[k++] = L2->data[j++];
}
}
// 将L1或L2中剩余的元素复制到L3中
while (i < L1->length) {
L3->data[k++] = L1->data[i++];
}
while (j < L2->length) {
L3->data[k++] = L2->data[j++];
}
L3->length = k; // 设置L3的长度
}
int main() {
SqList L1, L2, L3;
InitList(&L1); // 初始化L1
InitList(&L2); // 初始化L2
InitList(&L3); // 初始化L3
// 给L1赋值
ListInsert(&L1, 1, 1);
ListInsert(&L1, 2, 3);
ListInsert(&L1, 3, 5);
ListInsert(&L1, 4, 7);
// 给L2赋值
ListInsert(&L2, 1, 2);
ListInsert(&L2, 2, 4);
ListInsert(&L2, 3, 6);
ListInsert(&L2, 4, 8);
// 归并L1和L2
MergeList(&L1, &L2, &L3);
// 输出L3的元素
for (int i = 0; i < L3.length; i++) {
printf("%d ", L3.data[i]);
}
printf("\n");
return 0;
}
阅读全文