前言
現在已經大三,纔開始系統的學習算法,雖然有些晚,但是因爲之前有一些基礎,學起來進度也挺快,不失爲一件好事。在學習的過程中,必不可少的需要去複習數據結構,那麼今天就從最基礎的線性表開始聊起。我們都知道線性表是最簡單的一種數據結構,但是他可以做的事情很多,因爲表中的每一個節點都可以表示很多信息,一個數字、一個人的所有信息、一本書……線性表的實現可以是順序實現,也可以是鏈式實現。順序實現也就是通過我們最基礎的數組,通過分配一段連續的存儲單元,而鏈式實現則是通過動態的申請空間來實現。爲了簡單起見,下面的代碼我們都把每個結點當做一個數字,並分別對鏈表進行增刪改查操作。另外爲了方便期間,對於異常情況的輸出信息放在子函數實現。
順序實現
#include<stdio.h>
#define MAX 1005
// 定義結構體
typedef struct list {
int data[MAX]; //數組
int count; // 線性表元素總個數
} List;
// 線性表初始化
void init(List *p) {
// 總個數爲0
p->count = 0;
}
// 元素的插入
void insert(List *p, int pos, int data) {
int flag = 1;
// 判斷需要插入的位置是否大於目前線性表元素總個數
if(pos > p->count) {
printf("%d插入失敗,插入位置大於元素總個數\n", data);
flag = 0;
}
// 判斷是否線性表已經滿了
if(p->count >= MAX) {
printf("%d插入失敗,線性表已經滿了\n", data);
flag = 0;
}
for(int i=p->count+1; i > pos; i--)
p->data[i] = p->data[i-1];
p->data[pos] = data;
if(flag) p->count++;
}
// 元素的輸出
void print(List *p) {
for(int i=0; i < p->count; i++)
printf("%3d ", p->data[i]);
printf("\n");
}
// 元素的修改
void update(List *p, int pos, int data) {
if(pos > p->count)
printf("修改失敗,不存在%d位置\n", pos);
p->data[pos] = data;
}
// 刪除元素
void deleteByPos(List *p, int pos) {
int flag = 1;
if(pos > p->count) {
printf("刪除失敗,不存在%d位置\n", pos);
flag = 0;
}
for(int i=pos; i < p->count; i++)
p->data[i] = p->data[i+1];
if(flag) p->count--;
}
int main() {
// 聲明一個線性表
List s;
int insertResult;
// 初始化
init(&s);
// 對線性表插入數據
insert(&s, 0, 100);
insert(&s, 1, 200);
insert(&s, 2, 300);
insert(&s, 0, 99);
insert(&s, 10, 999);
insert(&s, 2, 199);
// 輸出線性表
print(&s);
// 修改數據
update(&s, 0, 0);
update(&s, 10, 0);
print(&s);
// 刪除數據
deleteByPos(&s, 1);
deleteByPos(&s, 20);
print(&s);
return 0;
}
鏈表實現
#include<stdio.h>
// 定義節點結構體
typedef struct node {
int data;
struct node *next;
} Node;
// 定義鏈表結構體
typedef struct list {
Node *head;
} List;
// 線性表初始化
void init(List *p) {
// 頭部節點爲空
p->head = NULL;
}
// 元素的插入
void insert(List *p, int pos, int data) {
Node *newNode, *m;
newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
if(pos == 0){
newNode -> next = p->head;
p -> head = newNode;
} else {
m = p->head;
for(int i=0; i < pos-1 && m != NULL; i++)
m = m ->next;
if(m != NULL){
newNode -> next = m -> next;
m -> next = newNode;
} else printf("%d插入失敗,插入位置大於元素總個數\n", data);
}
}
// 元素的修改
void update(List *p, int pos, int data) {
Node *m;
m = p -> head;
for(int i=0; i < pos && m != NULL; i++)
m = m->next;
if(m != NULL)
m -> data = data;
else
printf("修改失敗,不存在%d位置\n", pos);
}
// 元素的刪除
void deleteByPos(List *p, int pos) {
Node *m, *t;
m = p -> head;
if(pos == 0) {
p -> head = m -> next;
free(m);
} else {
for(int i=0; i < pos-1 && m != NULL; i++)
m = m -> next;
if(m != NULL) {
t = m -> next;
if(t != NULL) {
m -> next = t -> next;
free(t);
} else printf("刪除失敗,不存在%d位置\n", pos);
} else printf("刪除失敗,不存在%d位置\n", pos);
}
}
// 元素的輸出
void print(List *p) {
Node *m;
m = p -> head;
while(m != NULL) {
printf("%3d ", m->data);
m = m -> next;
}
printf("\n");
}
int main() {
// 聲明一個線性表
List s;
// 初始化
init(&s);
// 對線性表插入數據
insert(&s, 0, 100);
insert(&s, 1, 200);
insert(&s, 2, 300);
insert(&s, 0, 99);
insert(&s, 10, 999);
insert(&s, 2, 199);
// 輸出線性表
print(&s);
update(&s, 0, 0);
update(&s, 10, 0);
print(&s);
// 刪除數據
deleteByPos(&s, 0);
deleteByPos(&s, 5);
deleteByPos(&s, 1);
deleteByPos(&s, 20);
print(&s);
return 0;
}