單鏈表

來源:互聯網
上載者:User

標籤:指標   ext   str   null   namespace   表頭   插入   The   illegal   

程式構思:單鏈表的建立

(1) 先建立頭結點head,將頭結點的指標域置為空白。

(2) 建立一個指向頭結點的指標m,即Node *m = head;(首端插入方式不需要該步驟)。

(3) 建立一個結點p,把此新結點連結到單鏈表的尾端(p->next設為空白)或者始端。

1??首端插入方式

? ①p->next指向頭結點指向的下一個結點head->next。

? ②head->next指向p。

2??尾端插入方式。

? ①m->next指向p,即m->next = p;

? ②把指標p賦值給m,也就是說每次m都要最終指向新插入的結點。m = p;

單鏈表的插入

(1) 建立一個結點p,指定插入位置。

(2) 從單鏈表開始尋找結點位置。

? ①找到該位置,則p->next指向當前位置的下一個結點,當前位置結點指向建立結點p。

? ②沒有找到該位置,插入操作失敗。

單鏈表的刪除

(1) 指定刪除位元置。

(2) 鏈表頭開始找到結點位置。

? ①找到該位置,則刪除該位置的結點。

? ②沒有找到該位置,刪除操作失敗。

範例程式碼
#include <iostream>#include <stdlib.h>#include <cstdio>using namespace std;   typedef int ElementType;    //指定單鏈表中資料類型 //單鏈表格儲存體結構定義typedef struct Node{    ElementType data;  //資料域    struct Node *next; //指標域}*LinkList; #pragma mark - 建立一個空線性表/單鏈表(方法一)/****----------------------------------------------****///單鏈表建立方法一(函數用傳回值得到表頭指標)//函數名: CreateOne(int n)//參數:  (傳入)int n, 傳入線性表結點數量//作用: 建立一個空線性表//傳回值:Node *型返回結構體指標,即得到建立的線性表頭指標/****---------------------------------------------****/ Node* CreateOne(int n){    int i;    Node *head;  //定義頭結點指標    Node *p;     //定義新結點指標        //建立帶頭結點的線性鏈表    head = (Node*)malloc(sizeof(Node));    head->next = NULL;        cout << "Please input the data for LinkList Nodes:" << endl;        /** 該鏈表建立並初始化採用的是從表尾插入n個元素,比如如果輸入的是:1 2 3,那麼輸出鏈表時會輸出3 2 1 */    /*    for (i = n; i > 0; i--) {        p = (Node*)malloc(sizeof(Node));   //為新結點申請空間,即建立一個新結點        scanf("%d", &p->data);  //新結點賦值        //新結點插入到表頭        p->next = head->next;        head->next = p;    }     */        /** 該鏈表建立並初始化採用的是從表頭插入n個元素,比如輸入的是:1 2 3, 那麼輸出的順序也是會: 1 2 3 */    Node *tempNode = head;    for (i = n; i > 0; i--) {        p = (Node*)malloc(sizeof(Node));   //為新結點申請空間,即建立一個新結點        scanf("%d", &p->data);  //新結點賦值        //新結點插入到表尾        tempNode->next = p;        tempNode = p;    }    tempNode->next = NULL;    return head;   //返回頭結點指標,即可以得到單鏈表的地址} #pragma mark - 建立一個空線性表/單鏈表(方法二)/****----------------------------------------------****///單鏈表建立方法二(函數無傳回值)//函數名: CreateTwo(Node* head, int n)//參數: (傳入)Node* head傳入一個鏈表指標//     (傳入)int n,傳入線性表結點數量//作用: 建立一個空線性表//傳回值: 無/****---------------------------------------------****/ void CreateTwo(Node *head, int n){    int i;    Node *p;   //定義新結點指標        //建立帶頭結點的線性鏈表    head = (LinkList)malloc(sizeof(Node));    head->next = NULL;        cout << "Please input the data for LinkList Nodes:" << endl;    for (i = n; i > 0; i--) {        p = (Node*)malloc(sizeof(Node));   //為新結點申請空間,即建立一新結點        scanf("%d", &p->data);   //為新結點賦值                //新結點插入到表頭        p->next = head->next;        head->next = p;    }} #pragma mark - 向單鏈表中插入一個元素/****----------------------------------------------****///函數名: InsertNode(Node *L, int i, ELementType e)//參數: (傳入)Node *L,傳入線性表頭指標L//     (傳入)int i插入位置//     (傳入)ELementType e插入元素//作用: 線性表中插入一個元素//傳回值: int型,返回1表示操作成功,0表示失敗/****---------------------------------------------****/int InsertNode(Node *L, int i, ElementType e){    Node *p = L;   //定義一個指向第一個結點的指標    int j = 0;        //順指標向後尋找, 直到p指向第一個結點    while (p && j < i) {        p = p->next;        j++;    }        //插入位置合法性判斷    if (!p || j > i) {        cout << "Error! The location is illegal!"  << endl;        return 0;    }        Node *s;    s = (Node*)malloc(sizeof(Node));   //建立新結點    s->data = e;    //新結點賦值        //插入結點    s->next = p->next;    p->next = s;    return 1;} #pragma mark - 刪除單鏈表中的一個元素/****----------------------------------------------****///函數名: DeleteNode(LinkList &L, int i, ELementType &e)//參數: (傳入)LinkList &L,線性表頭指標L的地址//     (傳入)int i刪除位元置//     (傳出)ElementType &e 儲存刪除節點元素的值//作用: 線性表中刪除一個元素//傳回值: ElementType型返回刪除結點元素的值/****---------------------------------------------****/ElementType DeleteNode(LinkList &L, int i, int &e){    Node *p;    p = L;    //定義一個指向第i個結點的指標p    Node *q;  //暫時存放待刪除結點    int j = 0;        //順指標向後尋找,直到p指向第i個結點    while (p->next && j < i) {        p = p->next;        j++;    }        //刪除位元置合法性判斷    if (!p || j > i) {        cout << "element is not exist!";        return 0;    }        q = p->next;    p->next = q->next;  //刪除第i個結點    e = q->data;    free(q);    return e;   //返回刪除結點元素的值} #pragma mark - 顯示線性表中的所有元素/****----------------------------------------------****///函數名: DisplayList(LinkList &L)//參數: (傳入)LinkList &L,線性表頭指標L的地址//作用: 顯示線性表中所有元素//傳回值: 無/****---------------------------------------------****/void DisplayList(LinkList &L){    Node *p;    p = L->next;    //定義一個指向表頭結點的指標p    while (p != NULL) {        printf("%d ", p->data);        p = p->next;    }    printf("\n");} #pragma mark - 主函數int main(int argc, const char * argv[]) {    Node *L1;    int NodeNum;    printf("Please input the Init LinkNode Number:\n");    scanf("%d", &NodeNum);    L1 = CreateOne(NodeNum);        //Node *L2;    //CreateTwo(L2, NodeNum);  //也可以這樣產生L2鏈表        //輸出當前鏈表內容    printf("the current L1 is:");    DisplayList(L1);        //調用    int result;   //為了判斷調用成功與否,可以定義result以備檢查    result = InsertNode(L1, 3, 88);    if (result) {        printf("success to insert!\n");    }        ElementType deleteNumber;    DeleteNode(L1, 0, deleteNumber);    printf("被刪除的元素為: %d\n", deleteNumber);    //輸出當前鏈表的內容    printf("the curent L1 is:");    DisplayList(L1);    return 0;}

單鏈表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.