鏈表整體代碼及相關操作:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//宣告結點結構
typedef struct ListNode {
int data;
struct ListNode *next;
} ListNode;
//宣告鏈表結構
typedef struct LinkList {
ListNode head;
int length;
} LinkList;
//初始化結點
ListNode *init_listnode(int val) {
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
p->data = https://www.cnblogs.com/HanaKoo/archive/2022/03/29/val;
p->next = NULL;
return p;
}
//初始化鏈表
LinkList *init_linklist() {
LinkList *l = (LinkList *)malloc(sizeof(LinkList));
l->head.next = NULL;
l->length = 0;
return l;
}
//清除結點
void clear_listnode(ListNode *node) {
if (node == NULL) return ;
free(node);
return ;
}
//清除鏈表
void clear_linklist(LinkList *l) {
if (l == NULL) return ;
ListNode *p = l->head.next, *q;
while (p) {
q = p->next;
clear_listnode(p);
p = q;
}
free(l);
return ;
}
//資料(結點)插入
int insert(LinkList *l, int ind, int val) {
if (l == NULL) return 0;
if (ind < 0 || ind > l->length) return 0;
ListNode *p = &(l->head), *node = init_listnode(val);
while (ind--) {
p = p->next;
}
node->next = p->next;
p->next = node;
l->length += 1;
return 1;
}
//洗掉操作
int erase(LinkList *l, int ind) {
if (l == NULL) return 0;
if (ind < 0 || ind >= l->length) return 0;
ListNode *p = &(l->head), *q;
while (ind--) {
p = p->next;
}
q = p->next->next;
clear_listnode(p->next);
p->next = q;
l->length -= 1;
return 1;
}
void output(LinkList *l) {
printf("LinkList(%d) : ", l->length);
//(for回圈中跳出條件為當p為空,不為空則持續回圈直到p為空)
for (ListNode *p = l->head.next; p; p = p->next) {
printf("%d -> ", p->data);
}
printf("NULL\n");
return ;
}
//測驗30次
#define MAX_OP 30
int main() {
srand(time(0));
LinkList *l = init_linklist();
for (int i = 0; i < MAX_OP; i++) {
int op = rand() % 3; //亂數在0-2之間
int ind = rand() % (l->length + 1); //插入位置0 到 lenght
int val = rand() % 100;
switch (op) {
//0,1 都進行插入操作
case 0:
case 1: {
printf("insert %d at %d to LinkList = %d\n",
val, ind, insert(l, ind, val));
} break;
//2 進行洗掉操作
case 2: {
printf("erase item at %d from LinkList = %d\n",
ind, erase(l, ind));
} break;
}
output(l);
printf("\n");
}
clear_linklist(l);
return 0;
}
附:鏈表定義(發文)
鏈表是一種物理存盤單元上非連續、非順序的存盤結構,資料元素的邏輯順序是通過鏈表中的指標鏈接次序實作的,鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成,每個結點包括兩個部分:一個是存盤資料元素的資料域,另一個是存盤下一個結點地址的指標域, 相比于線性表順序結構,操作復雜,由于不必須按順序存盤,鏈表在插入的時候可以達到O(1)的復雜度,比另一種線性表順序表快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而線性表和順序表相應的時間復雜度分別是O(logn)和O(1), 使用鏈表結構可以克服陣列鏈表需要預先知道資料大小的缺點,鏈表結構可以充分利用計算機記憶體空間,實作靈活的記憶體動態管理,但是鏈表失去了陣列隨機讀取的優點,同時鏈表由于增加了結點的指標域,空間開銷比較大,鏈表最明顯的好處就是,常規陣列排列關聯專案的方式可能不同于這些資料專案在記憶體或磁盤上順序,資料的存取往往要在不同的排列順序中轉換,鏈表允許插入和移除表上任意位置上的節點,但是不允許隨機存取,鏈表有很多種不同的型別:單向鏈表,雙向鏈表以及回圈鏈表,鏈表可以在多種編程語言中實作,像Lisp和Scheme這樣的語言的內建資料型別中就包含了鏈表的存取和操作,程式語言或面向物件語言,如C,C++和Java依靠易變工具來生成鏈表, Love for Ever Day轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/452023.html
標籤:其他
上一篇:【資料結構】線性表的順序存盤
