線性表的那些事兒

前言

現在已經大三,纔開始系統的學習算法,雖然有些晚,但是因爲之前有一些基礎,學起來進度也挺快,不失爲一件好事。在學習的過程中,必不可少的需要去複習數據結構,那麼今天就從最基礎的線性表開始聊起。我們都知道線性表是最簡單的一種數據結構,但是他可以做的事情很多,因爲表中的每一個節點都可以表示很多信息,一個數字、一個人的所有信息、一本書……線性表的實現可以是順序實現,也可以是鏈式實現。順序實現也就是通過我們最基礎的數組,通過分配一段連續的存儲單元,而鏈式實現則是通過動態的申請空間來實現。爲了簡單起見,下面的代碼我們都把每個結點當做一個數字,並分別對鏈表進行增刪改查操作。另外爲了方便期間,對於異常情況的輸出信息放在子函數實現。

順序實現

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章