1. 程式人生 > 其它 >有頭節點的單鏈表操作

有頭節點的單鏈表操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 20
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
typedef int Status;
typedef int ElemType;
//定義連結串列結構 
typedef struct     Node{
    ElemType data;
    struct Node *Next;
}Node;
typedef struct Node* LinkList;
//初始化連結串列 void ListCreate(LinkList *head){ *head=(LinkList)malloc(sizeof(Node)); (*head)->Next=NULL; }

解析初始化連結串列時為什麼形參使用二級指標:

  因為我們封裝的這個初始化連結串列的函式是有參無返回值的函式,大家都知道函式在執行完後會釋放掉函式內部的所有變數的記憶體空間,為了修改連結串列的內容得以儲存,則在主函式當中定義一個二級指標,則這個二級指標是在主函式當中開闢的記憶體空間,將它的地址傳入被調函式,通過*(間接訪問)去改變指標內部的值。因為這個二級指標的記憶體是在主函式中開闢的,只要主函式沒有結束就不會消失,故呼叫函式之後,完成了值的改變!後面的插入刪除都是用二級指標,同理!

//查詢連結串列中的元素並返回值到變數e中 
Status GetElem(LinkList L,int i,ElemType *e){
    LinkList p;
    int j=1;
    p=L->Next;
    while(p&&j<i){
        p=p->Next;
        j++;
    }
    if(j>i||!p)
        return ERROR;
    *e=p->data;
    return OK;
}

解析為什麼獲取連結串列中的元素時形參是一級指標而不是二級指標:

  首先,我們要封裝的這個函式功能是找到連結串列中指定位置的元素並返回這個元素的值到變數e中!由函式所要實現的功能可知,並沒有修改連結串列中的內容,因此只需要傳入一級指標可以遍歷連結串列就足夠了!

//插入節點 
Status ListInsert(LinkList *L,int i,ElemType e){
    int j=1;
    LinkList p=*L,a;
    while(p&&j<i){
        p=p->Next;
        j++;
    }
    if(!p||j>i)
        return ERROR;
    a=(LinkList)malloc(sizeof(Node));
    a->data=e;
    a->Next=p->Next;
    p->Next=a;
    return OK;
}
//刪除節點
Status ListDelete(LinkList *L,int i,ElemType *e){
    LinkList p=*L;
    int j=1;
    while(j<i&&p->Next){
        p=p->Next;
        j++;
    }
    if(j>i||!(p->Next))
        return ERROR;
    *e=p->Next->data;
    p->Next=p->Next->Next;
    return OK; 
}