1. 程式人生 > >(C語言)連結串列的建立、遍歷、插入和刪除

(C語言)連結串列的建立、遍歷、插入和刪除

作者:翁鬆秀


(C語言)連結串列的建立、遍歷、插入和刪除

連結串列結構定義

struct Node
{
    int value;
    struct Node* next;
};
typedef struct
Node LinkList;

為了方便,把頭結點“當成”第一個節點。

基本功能實現

  1. 連結串列的建立
    引數說明:n為要建立節點的長度,並將連結串列的value賦值為1到n。

LinkList* createList(int n)
{
    int i;
    LinkList *head = NULL;
    LinkList *p = NULL;
    LinkList *pAhead = NULL;

    head = (LinkList *)malloc(sizeof(LinkList));
    head->next = NULL;
    pAhead = head;
    for
(i=1;i<n;i++) { p = (LinkList*)malloc(sizeof(LinkList)); p->value = i; pAhead->next = p; pAhead = p; } p->next = NULL; return head; }
  • 連結串列的遍歷
    引數說明:head為連結串列指標,即指標是指向連結串列頭結點的指標。
void printLinkList(LinkList *head)
{
    LinkList *p
= NULL; p = head->next; while(p) { printf("%d ",p->value); p = p->next; } printf("\n"); }
  • 連結串列的插入

    引數說明:head為連結串列指標,Kth表示在第k個節點後面插入,value為要插入的節點的value值。

void insertNode(LinkList *head,int Kth,int value)
{
    LinkList *p = NULL;
    LinkList *temp = NULL;
    p = head;
    while(Kth>0)
    {
        p = p->next;
        Kth--;
    }
    temp = (LinkList *)malloc(sizeof(LinkList));
    temp->value = value;
    temp->next = p->next;
    p->next = temp;
}
  • 連結串列的刪除
    引數說明:head為連結串列指標,Kth為要刪除的節點為第k個。
void deleteNode(LinkList *head,int Kth)
{
    LinkList *p = NULL;
    LinkList *temp = NULL;
    p = head;
    while(Kth > 1)
    {
        p = p->next;
        Kth--;
    }
    temp = p->next;
    p->next = p->next->next;
    free(temp);
}

邊界條件判斷和錯誤情況處理

上面小節實現了連結串列的建立、遍歷、插入和刪除基本功能,但是沒有考慮到邊界條件,比如說要建立的連結串列長度為0、連結串列為空、要插入節點的位置K大於連結串列的長度等等。雖實現了基本功能,但程式的完整性和魯棒性差,這樣的程式要是投入使用那簡直是夢魘。所以下面加入考慮邊界條件和錯誤處理情況:

- 邊界條件:要建立的連結串列長度為0、要遍歷的連結串列為空、在頭節點後插入節點、在連結串列尾節點後插入節點、刪除一個空連結串列。
- 錯誤處理:要插入或者刪除的節點位置大於連結串列的長度。

最後程式碼以及測試用例:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

//連結串列結構的定義
struct Node
{
    int value;
    struct Node* next;
};
typedef struct Node LinkList;

//連結串列的建立
LinkList* createList(int n)
{
    int i;
    LinkList *head=NULL;
    LinkList *p=NULL;
    LinkList *pAhead=NULL;

    head = (LinkList *)malloc(sizeof(LinkList));
    head->next = NULL;
    pAhead = head;
    for(i=1;i<n;i++)
    {
        p=(LinkList*)malloc(sizeof(LinkList));
        p->value=i;
        pAhead->next = p;
        pAhead = p;
    }
    pAhead->next=NULL;
    return head;
}

//連結串列的遍歷
void printLinkList(LinkList *head)
{
    if(head == NULL)
    {
        printf("Null LinkList!\n");
        return ;
    }
    LinkList *p;
    p = head->next;
    while(p)
    {
        printf("%d ",p->value);
        p = p->next;
    }
    printf("\n");
    return ;
}
//連結串列的插入
void insertNode(LinkList *head,int Kth,int value)
{
    LinkList *p = NULL;
    LinkList *temp = NULL;
    p = head;
    while(Kth>0)
    {
        if(p->next != NULL)
        {
            p = p->next;
            Kth--;
        }
        else
        {
            printf("k > the length of LinkList!\n");
            return ;
        }
    }
    temp = (LinkList *)malloc(sizeof(LinkList));
    temp->value = value;
    temp->next = p->next;
    p->next = temp;
    return ;
}
//連結串列的刪除
void deleteNode(LinkList *head,int Kth)
{
    if(head == NULL)
    {
        printf("Null LinkList!");
        return ;
    }
    LinkList *p = NULL;
    LinkList *temp = NULL;
    p = head;
    while(Kth > 1)
    {
        if(p->next != NULL)
        {
            p = p->next;
            Kth--;
        }
        else
        {
            printf("k > the length of LinkList!\n");
            return ;
        }
    }
    temp = p->next;
    p->next = p->next->next;
    free(temp);
    return ;
}
int main()
{
    //基本功能測試
    LinkList *head = createList(10);
    printLinkList(head);
    insertNode(head,5,0);
    deleteNode(head,6);
    printLinkList(head);
    //邊界條件測試
    LinkList *zHead = createList(0);
    printLinkList(zHead);
    printLinkList(NULL);
    LinkList *iHead = createList(5);
    insertNode(iHead,1,20);
    insertNode(iHead,5,21);
    printLinkList(head);
    //錯誤處理測試
    LinkList *eHead = createList(10);
    insertNode(eHead,11,1);
    deleteNode(eHead,12);
    return 0;
}

測試結果

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

Null LinkList!
1 2 3 4 5 6 7 8 9
k > the length of LinkList!
k > the length of LinkList!

總結

寫程式不但要實現基本功能,還要考慮程式的邊界條件以及錯誤輸入或者操作時應有的處理,增強程式的完整性和魯棒性,不能輸入一個空指標程式就crash。