用c语言写一个线性顺序表,要有建立,输入,取值,查找,插入,删除, 输出, 删除自第i个元素开始的k个元素,就地逆置. 退出说明的地方用中文,
时间: 2023-08-31 08:32:21 浏览: 98
### 回答1:
好的,以下是用C语言实现线性顺序表的代码:
```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 CreateList(SqList *L) {
int i, n;
printf("请输入线性表的长度:");
scanf("%d", &n);
printf("请输入%d个元素的值:", n);
for (i = 0; i < n; i++) {
scanf("%d", &L->data[i]);
}
L->length = n;
printf("建立线性表成功!\n");
}
// 插入元素
void InsertList(SqList *L, int i, int e) {
int j;
if (i < 1 || i > L->length + 1) {
printf("插入位置不合法!\n");
return;
}
if (L->length >= MAXSIZE) {
printf("线性表已满,无法插入!\n");
return;
}
for (j = L->length; j >= i; j--) {
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e;
L->length++;
printf("插入元素成功!\n");
}
// 删除元素
void DeleteList(SqList *L, int i) {
int j;
if (i < 1 || i > L->length) {
printf("删除位置不合法!\n");
return;
}
for (j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
printf("删除元素成功!\n");
}
// 取值
void GetElem(SqList L, int i) {
if (i < 1 || i > L.length) {
printf("取值位置不合法!\n");
return;
}
printf("第%d个元素为:%d\n", i, L.data[i - 1]);
}
// 查找元素
int LocateElem(SqList L, int e) {
int i;
for (i = 0; i < L.length; i++) {
if (L.data[i] == e) {
return i + 1;
}
}
return 0;
}
// 输出线性表
void PrintList(SqList L) {
int i;
if (L.length == 0) {
printf("线性表为空!\n");
return;
}
printf("线性表的元素为:");
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
// 删除自第i个元素开始的k个元素
void DeleteK(SqList *L, int i, int k) {
int j;
if (i < 1 || i > L->length || i + k - 1 > L->length) {
printf("删除位置不合法!\n");
return;
}
for (j = i + k - 1; j < L->length; j++) {
L->data[j - k] = L->data[j];
}
L->length -= k;
printf("删除%d个元素成功!\n", k);
}
// 就地逆置线性表
void ReverseList(SqList *L) {
int i, temp;
for (i = 0; i < L->length / 2; i++) {
temp = L->data[i];
L->data[i] = L->data[L->length - i - 1];
L->data[L->length - i - 1] = temp;
}
printf("就地逆置线性表成功!\n");
}
int main() {
SqList L;
int choice, i, e, k, pos;
InitList(&L);
while (1) {
printf("\n");
printf("************线性顺序表操作菜单************\n");
printf("* 1.建立线性表 *\n");
printf("* 2.插入元素 *\n");
printf("* 3.删除元素 *\n");
printf("* 4.取值 *\n");
printf("* 5.查找元素 *\n");
printf("* 6.输出线性表 *\n");
printf("* 7.删除自第i个元素开始的k个元素 *\n");
printf("* 8.就地逆置线性表 *\n");
printf("* 0.退出 *\n");
printf("******************************************\n");
printf("请输入对应的操作序号:");
scanf("%d", &choice);
switch (choice) {
case 0:
printf("谢谢使用!\n");
return 0;
case 1:
CreateList(&L);
break;
case 2:
printf("请输入要插入元素的位置和值:");
scanf("%d%d", &i, &e);
InsertList(&L, i, e);
break;
case 3:
printf("请输入要删除元素的位置:");
scanf("%d", &i);
DeleteList(&L, i);
break;
case 4:
printf("请输入要取值的元素位置:");
scanf("%d", &i);
GetElem(L, i);
break;
case 5:
printf("请输入要查找的元素值:");
scanf("%d", &e);
pos = LocateElem(L, e);
if (pos == 0) {
printf("查找元素失败!\n");
} else {
printf("元素%d的位置为:%d\n", e, pos);
}
break;
case 6:
PrintList(L);
break;
case 7:
printf("请输入要删除的起始位置和元素个数:");
scanf("%d%d", &i, &k);
DeleteK(&L, i, k);
break;
case 8:
ReverseList(&L);
break;
default:
printf("输入序号有误,请重新输入!\n");
break;
}
}
return 0;
}
```
希望对你有帮助!
### 回答2:
线性顺序表是一种用一组地址连续的存储单元依次存放线性表元素的数据结构。下面是一个用C语言实现线性顺序表的代码:
```
#include <stdio.h>
#define MAXSIZE 100 //定义线性表的最大长度
typedef struct {
int data[MAXSIZE]; //用数组存放线性表元素
int length; //线性表的长度
} SeqList;
//初始化线性顺序表
void InitList(SeqList *L) {
L->length = 0;
}
//插入元素到线性顺序表中的第i个位置
void InsertList(SeqList *L, int i, int e) {
if(i < 1 || i > L->length+1) {
printf("插入位置错误!\n");
return;
}
if(L->length >= MAXSIZE) {
printf("顺序表已满,无法插入!\n");
return;
}
for(int j = L->length; j >= i; j--) {
L->data[j] = L->data[j-1];
}
L->data[i-1] = e;
L->length++;
}
//删除线性顺序表中的第i个位置的元素
void DeleteList(SeqList *L, int i) {
if(i < 1 || i > L->length) {
printf("删除位置错误!\n");
return;
}
for(int j = i; j < L->length; j++) {
L->data[j-1] = L->data[j];
}
L->length--;
}
//输出线性顺序表中的元素
void PrintList(SeqList L) {
printf("线性顺序表中的元素为:");
for(int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
//查找线性顺序表中的元素e,并返回其位置
int SearchList(SeqList L, int e) {
for(int i = 0; i < L.length; i++) {
if(L.data[i] == e) {
return i+1;
}
}
return -1; //未找到元素e
}
//逆置线性顺序表
void ReverseList(SeqList *L) {
int temp;
for(int i = 0; i < L->length / 2; i++) {
temp = L->data[i];
L->data[i] = L->data[L->length-1-i];
L->data[L->length-1-i] = temp;
}
}
int main() {
SeqList L;
InitList(&L);
int n, e;
printf("请输入线性顺序表的长度:");
scanf("%d", &n);
printf("请输入线性顺序表的元素:");
for(int i = 1; i <= n; i++) {
scanf("%d", &e);
InsertList(&L, i, e);
}
PrintList(L);
printf("请输入要插入的位置和元素:");
int insert_pos, insert_value;
scanf("%d%d", &insert_pos, &insert_value);
InsertList(&L, insert_pos, insert_value);
PrintList(L);
printf("请输入要删除的位置:");
int delete_pos;
scanf("%d", &delete_pos);
DeleteList(&L, delete_pos);
PrintList(L);
printf("请输入要查找的元素:");
int search_value;
scanf("%d", &search_value);
int result = SearchList(L, search_value);
if(result != -1) {
printf("元素%d在线性顺序表中的位置为:%d\n", search_value, result);
} else {
printf("元素%d不在线性顺序表中!\n", search_value);
}
printf("请输入要删除自第i个元素开始的k个元素的位置和长度:");
int delete_start, delete_length;
scanf("%d%d", &delete_start, &delete_length);
for(int i = 0; i < delete_length; i++) {
DeleteList(&L, delete_start);
}
PrintList(L);
printf("逆置线性顺序表:");
ReverseList(&L);
PrintList(L);
return 0;
}
```
以上代码实现了线性顺序表的建立、输入、取值、查找、插入、删除、输出、删除自第i个元素开始的k个元素以及就地逆置操作。运行代码会在命令行窗口中逐步显示操作的结果,并等待用户输入相关数据完成各种操作。若用户选择退出,可以在代码中添加相应的退出提示。
阅读全文