前两节看过了顺序表的概念和实现,今天来试着运行一下顺序表增删改查的代码。
准备工作
先安装下编辑器吧,系统还是之前状的 ubuntu18.10
,软件商店可以直接安装 jetbrains
家的 c 语言编辑器 Clion
,晚上的时候会有点慢。
另外这里跟前两篇中的代码会有些区别,因为之前涉及到的代码是 c++ 而这里是 c,所以这里需要注意一下。
查到资料说也可以通过引入 stdbool.h 来使用.。
创建一个新项目,打开后会有一个默认的 main.c
文件。每个 c 项目默认应该是只有一个 mian
函数,为了明确结构,新建一个 list.c
文件,然后修改 CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.13)
project(c C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
set(SOURCE_FILES main.c)
add_executable(main ${SOURCE_FILES})
这样修改后在 main.c
文件中引入新的 list.c
文件就可以正确编译了。
main.c
#include <stdio.h>
int main( )
{
printf("Hello, World!\n");
return 0;
}
/* 执行输出
Hello, World!
list.c
1 月 12 日更新:
其中SqList L
L 是结构体名,SqList * L
是结构体指针,通过指针调用参数时用符号->
,通过结构体调用参数时用符号.
。作为新手很容易搞混,学了几章后特意回来说明一下。
//
// Created by wu on 19-1-12.
//
#include <stdbool.h>
#include <stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
int listsize;
} SqList;
void list_init(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("%3d", L->data[i]);
}
printf("\r\n\r\n");
}
/**
* 顺序表插入
* @param L
* @param i
* @param e
* @return
*/
bool list_insert(SqList *L, int i, ElemType e) {
if (i < 1 || i > L->length + 1) return false; //位置输入错误
if (L->length >= MaxSize) return false; // 存储空间已满
for (int j = L->length; j >= i; j--) {
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e;
L->length++;
return true;
}
/**
* 顺序表删除操作
* @param L
* @param i
* @return
*/
bool delete_elem(SqList *L, int i) {
if (i < 1 || i > L->length) return false; // 删除位置错误
for (int j = i; j < L->length; j++) { //移动 i 结点的后继结点
L->data[j - 1] = L->data[j];
}
L->length--;
return true;
}
/**
* 顺序表查操作
* @param L
* @param i
* @return
*/
int search_elem(SqList *L, int i) {
for (int j = 0; j < L->length; ++j) {
if (i == L->data[j]) {
return j + 1;
}
}
return 0;
}
main.c
#include <stdio.h>
#include <malloc.h>
#include "list.c"
int main() {
SqList L; // 结构体
list_init(&L);
list_insert(&L,1,20);
printList(&L);
delete_elem(&L,2);
printList(&L);
ElemType x = search_elem(&L,2);
printf("%3d\r\n",x);
printf("Hello, World!\n");
return 0;
}
执行结果
20 1 2 3
20 2 3
2
Hello, World!
重新整理一遍清晰多了,而且又加深了下记忆。
顺便提一下,printf("%3d\r\n",x);
中的 3 是指打印数据占据 3 位,不足补空格。