目录
一、 顺序表的存储结构定义
-
动态存储
#include<stdio.h> #include<stdlib.h> typedef struct { int *elem; int length; }Sqlist; // L.elem = (int*)malloc(sizeof(int) * MAXISIZE);
-
静态存储
#include<stdio.h> #define MAXSIZE 100 typedef struct { int elem[MAXSIZE];//int这里可以换成你要的类型 int length;//线性表的长度 }Sqlist;
二、 顺序表的实现
-
顺序表的初始化(第一种静态输入)
//初始化线性表 int InitList_Sq(SqList& L) { L.elem = new int[MAXSIZE];//同样也可以使用动态存储 if (!L.elem) exit(OVERFLOW);//OVERFLOW是宏定义 L.length = 0; return OK; }
-
顺序表的初始化(第二种动态输入)
//线性表的初始化 void InitList_Sq(Sqlist &L) { L.elem = (int*)malloc(sizeof(int) * MAXISIZE); if (!L.elem) exit(OVERFLOW); L.length = 0; printf("初始化成功!输入表的长度:"); scanf("%d", &L.length); printf("输入%d个数:", L.length); int i; for (i = 0; i < L.length; i++) { scanf("%d", &L.elem[i]); } }
这里可能会出现 C6031:返回值被忽略:“scanf“ 错误问题,在上面加上代码“ #pragma warning(disable:4996) ”即可 !!!注意!!!这里初始化后已经进行输入了,就不需要下面创建表的这个操作
#pragma warning(disable:4996)
-
创建表
//创建表 void CreateList(Sqlist &L, int a[], int n) { for (int i = 0; i < n; i++) { L.elem[i] = a[i]; L.length++; } }
-
销毁顺序表
//顺序表的销毁 void DestoryList(Sqlist &L) { if (L.elem) delete L.elem; printf("销毁成功!");
-
清空顺序表
//顺序表的清空 void ClearList(Sqlist& L) { L.length = 0; printf("清空成功!"); }
-
顺序表的长度获取
int GetLength(Sqlist L) { return (L.length); }
-
判断顺序表是否为空
int IsEmpty(Sqlist L) { if (L.length == 0) return 1; else return 0; }
-
获取顺序表中某位置的元素
int GetElem(Sqlist L, int i, int &e) { if (i<1 || i>L.length) return ERROR; e = L.elem[i - 1]; return OK; }
-
查找元素在顺序表的位置
int LocateElem(Sqlist L, int e) { int i; for (i = 0; i < L.length; i++) { if (L.elem[i] == e) return i + 1; return 0; } }
-
插入元素
int ListInsert_Sq(Sqlist &L, int i, int e) { if (i<1 || i>L.length + 1) return ERROR; if (L.length == MAXISIZE) return ERROR; for (int j = L.length - 1; j >= i - 1; j--) { L.elem[j + 1] = L.elem[j]; } L.elem[i - 1] = e; L.length++; return OK; }
-
输出顺序表
void showSqlist(Sqlist &L) { for (int i = 0; i < L.length; i++) { printf("%3d", L.elem[i]); } }
三、顺序表基本操作的整体应用
-
源代码
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
#define MAXISIZE 100
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef struct {
int *elem;
int length;
}Sqlist;
//线性表的初始化
void InitList_Sq(Sqlist &L) {
L.elem = (int*)malloc(sizeof(int) * MAXISIZE);
if (!L.elem) exit(OVERFLOW);
L.length = 0;
printf("初始化成功!输入表的长度:");
scanf("%d", &L.length);
printf("输入%d个数:", L.length);
int i;
for (i = 0; i < L.length; i++) {
scanf("%d", &L.elem[i]);
}
}
//创建表
//void CreateList(Sqlist &L, int a[], int n) {
// for (int i = 0; i < n; i++) {
// L.elem[i] = a[i];
// L.length++;
// }
//}
//线性表的销毁
void DestoryList(Sqlist &L) {
if (L.elem) delete L.elem;
printf("销毁成功!");
}
//线性表的清空
void ClearList(Sqlist& L) {
L.length = 0;
printf("清空成功!");
}
//线性表的长度获取
int GetLength(Sqlist L) {
return (L.length);
}
//判断线性表是否为空
int IsEmpty(Sqlist L) {
if (L.length == 0) return 1;
else return 0;
}
//获取线性表中某位置的值
int GetElem(Sqlist L, int i, int &e) {
if (i<1 || i>L.length) return ERROR;
e = L.elem[i - 1];
return OK;
}
//查找线性表e所在位置
int LocateElem(Sqlist L, int e) {
int i;
for (i = 0; i < L.length; i++) {
if (L.elem[i] == e) return i + 1;
return 0;
}
}
//向线性表中插入一个值
int ListInsert_Sq(Sqlist &L, int i, int e) {
if (i<1 || i>L.length + 1) return ERROR;
if (L.length == MAXISIZE) return ERROR;
for (int j = L.length - 1; j >= i - 1; j--) {
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
L.length++;
return OK;
}
//输出线性表
void showSqlist(Sqlist &L) {
for (int i = 0; i < L.length; i++) {
printf("%3d", L.elem[i]);
}
}
int main() {
Sqlist L;
//int a[] = { 23,43,31,65,7,64,76,87,56,88 };
InitList_Sq(L);
IsEmpty(L);
//CreateList(L, a, 10);
ListInsert_Sq(L, 2, 1);//在2位置上插入了数字1
showSqlist(L);
printf("\n");
LocateElem(L, 3);
int a;
GetElem(L, 2, a);//获取2位置上的数字,输出为1
printf("%d",a);
printf("\n");
ClearList(L);
showSqlist(L);//清空了,所以输出为空
printf("\n");
DestoryList(L);
}
-
结语
具体的概念及原理,需要大家阅读书本去了解更多细节,更需要多打代码才能更好理解它的实现原理!