1. 程式人生 > >單鏈表的建立與基本操作

單鏈表的建立與基本操作

連結串列通過“指標”將一組零散的記憶體塊串聯在一起。其中,我們把記憶體塊稱為連結串列的“結點”。為了將所有的結點串起來,每個連結串列的結點除了儲存資料之外,還需要記錄鏈上的下一個結點的地址。如圖所示,我們把這個記錄下個結點地址的指標叫作後繼指標 next。

把第一個結點叫作頭結點,把最後一個結點叫作尾結點。其中,頭結點用來記錄連結串列的基地址。而尾結點特殊的地方是:指標不是指向下一個結點,而是指向一個空地址 NULL,表示這是連結串列上最後一個結點。

#include <iostream>
#include <malloc.h>
using namespace std;

typedef int ElementType;

//連結串列節點的定義
typedef struct ListNode
{
    ElementType Element;//資料域,存放資料
    ListNode * Next;//指向下一個連結串列節點
}Node,*PNode;
//建立連結串列
PNode CreateList(void)
{
    int len;//用於定義連結串列的長度
    int val;//用於存放節點數值
    PNode PHead = (PNode)malloc(sizeof(Node));//建立分配一個頭結點記憶體空間

    //用於檢測空間是否分配
    if(PHead == NULL)
    {
        printf("空間分配失敗\n");
        exit(-1);
    }

    PNode PTail = PHead;//定義連結串列的末尾節點,初始與頭結點一致。
    PTail->Next = NULL;//最後一個節點指標置為空
    printf("print the num of Node: ");
    scanf("%d",&len);//輸入節點數

    for(int i = 0;i<len;i++)
    {
        PNode pNew = (PNode)malloc(sizeof(Node));//分配一個新節點
        if(pNew == NULL){
            printf("failed");
            exit(-1);
        }
        printf("the %d Node :",i+1);
        scanf("%d",&val);

        pNew->Element = val;
        PTail->Next = pNew;//末尾節點指標指向下一個新節點
        pNew->Next = NULL;//新節點指標指向為空
        PTail = pNew;//將新節點複製給末尾節點
    }
    printf("list ok\n");
    return PHead;//返回頭節點
}
//連結串列的遍歷操作
void TraverseList(PNode List)
{
    PNode P = List->Next;//首節點複製給臨時變數,第一個節點
    if(P == NULL)
    {
        printf("failed");
    }
    while(P != NULL){
        printf("%d  ",P->Element);
        P = P->Next;
    }
    printf("\n");
}
//連結串列的查詢操作
PNode FindList(PNode List)
{
    PNode p = List->Next;//首節點複製給臨時變數,第一個節點
    int num = 0;  //    用於記錄連結串列節點位置
    int val = 3; //    用於存放要查詢的值
    while(p !=NULL && p->Element != val)
    {
        p = p->Next;
        num++;
    }
    if(p !=NULL)
    {
        printf("%d\n",num+1);//節點為第一個節點開始
    }
    else
    {
        printf("no found\n");
    }
    printf("\n");
    return p;
}
//在連結串列位置第pos節點前插入包含資料val的節點
void InsertList(PNode List,int pos,int val)
{
    int position = 0;
    PNode p = List;//定義節點指向"頭結點"

    //尋找pos節點的前驅結點
    while(p !=NULL && position<pos-1)
    {
        p = p->Next;
        position++;
    }

    PNode Tmp = (PNode)malloc(sizeof(PNode));//分配一個臨時節點用來儲存要插入的資料
    if(Tmp == NULL){
        printf("failed\n");
        exit(-1);
    }
    //插入節點
    Tmp->Element = val;
    Tmp->Next = p->Next;
    p->Next = Tmp;
}
//刪除連結串列中的元素
//刪除連結串列中的第pos節點
void DeleteList(PNode List,int pos)
{
    int position = 0;
    PNode p = List;

    while(p != NULL && position<pos-1)
    {
        p = p->Next;
        position++;
    }
    //刪除節點
    PNode Tmp = p->Next;//定義臨時指標Tmp指向要刪除的節點
    p->Next = Tmp->Next; //使要刪除節點的前驅結點指向其後驅節點
    free(Tmp);//釋放刪除節點的記憶體空間,防止記憶體洩漏
    Tmp = NULL;//使q指向空指標,防止產生野指標
}

//刪除整個連結串列操作
void DeleteTheList(PNode List)
{
    PNode p,Tmp;
    p = List->Next;
    List->Next = NULL;
    while(P != NULL)
    {
        Tmp = p->Next;//定義指標P指向連結串列要刪除的連結串列List的第一個點節點
        free(p); //釋放指標P指向的節點
        p = Tmp;//重新賦值
    }
}
//主函式
int main()
{
    PNode List = CreateList();
    TraverseList(List);
//    FindList(List);
    InsertList(List,2,0);
    TraverseList(List);
    DeleteList(List,2);
    TraverseList(List);
    return 0;
}

參照地址:http://www.cnblogs.com/maluning/p/7966875.html