数据结构C语言版:线性表之顺序存储
个人的学习笔记,如有不合理之处欢迎指正,谢谢!
自己写的代码(我只写了主要的插入、删除、遍历三种操作的代码,其他操作实现起来很简单我就没写)
#include<stdio.h>
#define MaxSize 10
typedef struct {
int data[MaxSize];
int length;
}SqList;
// 初始化顺序表
SqList* InitList(SqList* L) {
printf("此表为顺序表,最大可容纳10个数!\n");
L = (SqList*)malloc(sizeof(SqList));
L->length = 0;
int dat;
printf("请输入你的第%d个数据(输入0结束):", L->length + 1);
scanf("%d", &dat);
while (dat) {
if (FullList(L)) {
printf("空间不足,已自动退出!\n");
break;
}
L->data[L->length] = dat;
L->length++;
printf("请输入你的第%d个数据(输入0结束):",L->length + 1);
scanf("%d", &dat);
}
return L;
}
// 插入元素
int InsertList(SqList* L, int i, int e) {
if (FullList(L)) {
printf("空间不足,已自动退出!\n");
return;
}
if (i < 1 || i > L->length + 1) {
printf("插入的位置有误!\n");
return;
}
for (int l = L->length - 1; l > i-2; l--) {
L->data[l + 1] = L->data[l];
}
L->data[i - 1] = e;
L->length++;
return;
}
// 删除元素
int DeleteList(SqList* L, int i) {
if (EmptyList(L)) {
printf("L是空表,不可删除元素!\n");
return;
}
if (i < 1 || i > L->length) {
printf("删除的位置有误!\n");
return;
}
for (int l = i - 1; l < L->length -1; l++) {
L->data[l] = L->data[l + 1];
}
L->length--;
}
// 判断顺序表是否为空
int EmptyList(SqList* L) {
return L->length == 0;
}
// 判断顺序表是否为满
int FullList(SqList* L) {
return L->length == MaxSize;
}
// 遍历顺序表
int TraverseList(SqList* L) {
if (EmptyList(L)) {
printf("L是空表,不需要遍历!\n");
return;
}
for (int i = 0; i < L->length; i++) {
printf("%d ", L->data[i]);
}
putchar('\n');
}
int main() {
SqList* L = NULL;
int select, i, e;
L = InitList(L);
while (1) {
printf("1、插入元素 2、删除元素 3、遍历输出 4、退出程序\n");
printf("请输入你要进行的操作:");
scanf("%d", &select);
if (select == 1) {
printf("请输入你要插入的位置:");
scanf("%d", &i);
printf("请输入你要插入的元素:");
scanf("%d", &e);
InsertList(L, i, e);
}
else if (select == 2) {
printf("请输入你要删除的位置:");
scanf("%d", &i);
DeleteList(L, i);
}
else if (select == 3) {
TraverseList(L);
}
else {
break;
}
}
}
代码其二
#include<stdio.h>
#include<stdlib.h>
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2 // 溢出时使用
#define MAXSIZE 100
// Status是函数的类型,其值是函数结果的状态代码
typedef int Status;
typedef char ElemType;
typedef struct {
ElemType *elem; // 定义指针(数组)类型变量
int length;
}SqList;
// 线性表L的初始化(参数用引用类型,未使用指针)
Status InitList(SqList &L) {
// 使用new关键字为指针动态分配空间
// L.elem = new ElemType[MAXSIZE];
// 也可以这样
L.elem = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
if (!L.elem) { // 存储空间分配失败
exit(OVERFLOW); // 函数头文件在stdlib.h里面
}
L.length = 0;
return OK;
}
// 1.销毁线性表
void DestroyList(SqList &L) {
if (L.elem) {
delete L.elem; // 使用delete关键字(参数为指针)释放存储空间
printf("线性表已销毁!程序已退出!\n");
}
}
// 2.清空线性表
void ClearList(SqList &L) {
L.length = 0; // 将线性表长度设置为0
printf("线性表已清空!\n");
}
// 3.求线性表的长度
int GetLength(SqList L) {
return L.length; // 返回线性表的长度
}
// 4.判断线性表是否为空
int IsEmpty(SqList L) {
if (L.length == 0) {
printf("线性表为空!\n");
return 1;
}
else {
printf("线性表不为空!\n");
return 0;
}
}
// 5.顺序表的取值
int GetElem(SqList L, int i, ElemType &e) {
if (i < 1 || i > L.length) { // 判断i值是否合理
printf("下标越界!\n");
return ERROR;
}
e = L.elem[i - 1];
printf("取值成功!\n");
return OK;
}
//6.顺序表的查找
int LocateElem(SqList L, ElemType e) {
// 在线性表中查找值为e的数据元素,返回其序号
for (int i = 0; i < L.length; i++) {
if (e == L.elem[i]) {
printf("查找成功!\n");
return i + 1; // 查找成功
}
}
printf("查找失败!\n");
return 0; // 查找失败,返回0
}
// 7.顺序表的插入
Status ListInsert(SqList &L, int i, ElemType e) {
if (i<1 || i>L.length + 1) {
printf("下标越界!\n");
return ERROR; // i值不合法
}
if (L.length == MAXSIZE) {
printf("当前存储空间已满!\n");
return ERROR;// 当前存储空间已满
}
for (int j = L.length - 1; j >= i - 1; j--) {
// 插入位置以及之后的元素后移
L.elem[j + 1] = L.elem[j];
}
// 赋值
L.elem[i - 1] = e;
// 表长加1
L.length++;
printf("插入元素成功!\n");
return OK;
}
// 8.顺序表的删除
Status ListDelete(SqList &L, int i) {
if (i < 1 || i > L.length) {
printf("下标越界!\n");
return ERROR;
}
for (int j = i; j <= L.length - 1; j++) {
L.elem[j - 1] = L.elem[j];
}
L.length--;
printf("删除元素成功!\n");
return OK;
}
// 9.遍历输出
void ListTraverse(SqList &L) {
printf("线性表的元素值为:\n");
for (int i = 0; i < L.length; i++) {
printf("%c ",L.elem[i]);
}
putchar('\n');
}
// 主函数
void main() {
SqList L;
InitList(L);
int i = 0, signal;
ElemType data;
printf("请输入线性表的初始元素,输入enter表示输入结束:\n");
scanf("%c",&data);
while (data != '\n') {
if (data != ' ') {
L.elem[i++] = data;
L.length++;
}
scanf("%c", &data);
}
while (1) {
printf("---------------------------------\n");
printf("+ 1.DestroyList 2.ClearList +\n");
printf("+ 3.GetLength 4.IsEmpty +\n");
printf("+ 5.GetElem 6.LocateElem +\n");
printf("+ 7.ListInsert 8.ListDelete +\n");
printf("+ 9.ListTraverse 10.End +\n");
printf("---------------------------------\n");
printf("请输入您要进行的操作:");
scanf("%d",&signal);
if (signal == 1) {
DestroyList(L);
break; // 销毁后自动退出
}
if (signal == 2) {
ClearList(L);
}
if (signal == 3) {
printf("线性表的长度为:%d\n", GetLength(L));
}
if (signal == 4) {
IsEmpty(L);
}
if (signal == 5) {
ElemType e;
printf("请输入要获得的元素下标:");
scanf("%d", &i);
if (GetElem(L, i, e) != 0) {
printf("%d位置上的元素值为:%c\n", i, e);
}
}
if (signal == 6) {
ElemType e;
printf("请输入要查找的元素:");
getchar(); // 在选择6操作的时候按了回车,所以要接收回车
scanf("%c", &e);
getchar();
i = LocateElem(L, e);
if (i != 0) {
printf("%c元素的位置为:%d\n", e, i);
}
}
if (signal == 7) {
ElemType e;
printf("请输入要插入的元素位置和元素:");
scanf("%d", &i);
getchar();
scanf("%c", &e);
getchar();
if (ListInsert(L, i, e) != 0) {
printf("%d位置上的元素值为:%c\n", i, e);
}
}
if (signal == 8) {
printf("请输入要删除的元素位置:");
scanf("%d", &i);
ListDelete(L, i);
}
if (signal == 9) {
ListTraverse(L);
}
if (signal == 10) {
printf("程序已退出!\n");
break;
}
}
}