1. 程式人生 > 其它 >順序表的鏈式儲存結構

順序表的鏈式儲存結構

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//如果需要良好的封裝的話就需要兩個結構
typedef struct ListNode {
    int data;
    struct ListNode* next;
};

typedef struct LinkList {
    ListNode* head;
    int length;
};


ListNode* init_listnode(int val) {
    ListNode* p = (ListNode*)malloc(sizeof
(ListNode)); p->data = 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; //如果連結串列的資料域也是malloc出來的,也要free資料域 free(node); return; } void clear_linklist(LinkList* l) { if (l == NULL) { return; } ListNode* p = l->head->next, * q; while (p) { //銷燬的同時要有一個q來儲存刪除結點的後面一個結點 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++; return; } 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; } //現在p就指向了待刪除結點的前一個位置 q = p->next->next; clear_listnode(p->next); p->next = q; l->length--; return 1; } void OutPut(LinkList* l) { printf("LinkList(%d) : ", l->length); for (ListNode* p = l->head->next; p; p = p->next) { printf("%d -> ", p->data); } printf("NULL\n"); return; } //上面是連結串列的相關定義 int main() { LinkList* l = init_linklist(); srand(time(0)); for (int i = 0; i <30 ; i++) { int op = rand() % 4; int ind = rand() % (l->length + 1); int val = rand() % 100; switch (op) { case 0: case 1: case 2: { printf("insert %d at %d to LinkList %d\n", val, ind, insert(l, ind, val)); }break; case 3: { printf("erase item at %d from LinkList = %d\n", ind, erase(l, ind)); }break; } OutPut(l); } }

這個與mooc陳越上面的鏈式表還是有很大的不同的。這個版本的封裝程度大了很多。而且對連結串列進行了兩次封裝。個人覺得這種的更好。整體封裝程度更高,也更好理解。做一個積累。