数据结构重学日记(六)顺序表增删改查
2019-01-07 本文已影响2人
南瓜方糖
前两节看过了顺序表的概念和实现,今天来试着运行一下顺序表增删改查的代码。
先安装下编辑器吧,系统还是之前状的 ubuntu18.10
,软件商店可以直接安装 jetbrains
家的 c 语言编辑器 Clion
,晚上的时候会有点慢。
另外这里跟前两篇中的代码会有些区别,因为之前涉及到的代码是 c++ 而这里是 c,所以这里需要注意一下。
查到资料说也可以通过引入 stdbool.h 来使用,这里就先不用了吧。
创建一个新项目,打开后会有一个默认的 main.c 文件
#include <stdio.h>
int main( )
{
printf("Hello, World!\n");
return 0;
}
/* 执行输出
Hello, World!
再来初始化并输出一个顺序表:
#include <stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
} SqList;
void InitList(SqList *L) {
L->data[0] = 1;
L->data[1] = 2;
L->data[2] = 3;
L->length = 3;
}
void PrintList(SqList *L) {
for (int i = 0; i < L->length; ++i) {
printf("%d",L->data[i]);
printf("\r\n");
}
}
int main() {
SqList L;
ElemType res;
int del;
int loc;
InitList(&L);
PrintList(&L);
printf("Hello, World!\n");
return 0;
}
/* 执行输出
1
2
3
*/
可以看到输出了 1,2,3 和 Hello, World,接下来在顺序表第二个位置插入一个新的数据元素 60:
插入操作,在 main() 中调用 res = InsertList(&L, 2, 60);
:
int InsertList(SqList *L,int i, ElemType e){
if(i < 1 || i > L->length +1){
printf("位置输入错误\r\n");
return 0;
}
if(L->length > MaxSize){
printf("存储空间已满\r\n");
return 0;
}
for(int j = L->length; j >= i -1; j--){
L->data[j+1] = L->data[j];
}
L->data[i -1] = e;
L->length++;
return 1;
}
/* 执行结果
1
60
2
3
*/
可以看到 60 已经被插入到了顺序表第二个位置。
删除操作del = DeleteElem(&L, 2, &del);
:
int DeleteElem(SqList *L, int i, int *e) {
if (i < 1 || i > L->length) {
return 0;
}
*e = L->data[i];
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
return 1;
}
/* 执行结果
1
60
2
3
1
2
3
*/
查操作 loc = SearchElem(&L, 2);
:
int SearchElem(SqList *L,int i){
for(int j = 0; j< L->length;j++){
if(L->data[j] == i){
return j +1;
}
}
return 0;
}
/* 执行结果
2
*/
查操作这里也可以改成用位置查值,还有改操作比较简单,就不做了。
完整代码:
#include <stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
} SqList;
void InitList(SqList *L) {
L->data[0] = 1;
L->data[1] = 2;
L->data[2] = 3;
L->length = 3;
}
void PrintList(SqList *L) {
for (int i = 0; i < L->length; ++i) {
printf("%d", L->data[i]);
printf("\r\n");
}
}
int InsertList(SqList *L, int i, ElemType e) {
if (i < 1 || i > L->length + 1) {
printf("位置输入错误\r\n");
return 0;
}
if (L->length > MaxSize) {
printf("存储空间已满\r\n");
return 0;
}
for (int j = L->length; j >= i - 1; j--) {
L->data[j + 1] = L->data[j];
}
L->data[i - 1] = e;
L->length++;
return 1;
}
int DeleteElem(SqList *L, int i, int *e) {
if (i < 1 || i > L->length) {
return 0;
}
*e = L->data[i];
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
return 1;
}
int SearchElem(SqList *L,int i){
for(int j = 0; j< L->length;j++){
if(L->data[j] == i){
return j +1;
}
}
return 0;
}
int main() {
SqList L;
ElemType res;
int del;
int loc;
InitList(&L);
res = InsertList(&L, 2, 60);
PrintList(&L);
printf("\r\n");
printf("%d\r\n", res);
printf("\r\n");
del = DeleteElem(&L, 2, &del);
PrintList(&L);
printf("\r\n");
printf("%d\r\n", del);
printf("\r\n");
loc = SearchElem(&L, 2);
printf("\r\n");
printf("%d\r\n", loc);
printf("\r\n");
printf("Hello, World!\n");
return 0;
}