在無頭結點的動態單鏈表上實現線性表操作 INSERT(L, i, B),並和在帶頭結點的動態單鏈表上實現相同操作的算法進行比較。

題目:

在無頭結點的動態單鏈表上實現線性表操作 INSERT(L, i, B),並和在帶頭結點的動態單鏈表上實現相同操作的算法進行比較。

分析:

首先我們要先初始化一個單鏈表,接下來要給這個單鏈表中添加數據元素,最後再在某一位置前插入某一數據元素

代碼:

鏈表初始化:

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

#define OK 1

typedef int Status;
typedef int ElemType;

typedef struct LNode
{
    ElemType data;  // 數據域
    LNode *next;   // 指針域
}LNode, *LinkList;

創建鏈表:

Status CreateList(LinkList &L, int e)
{  // 創建單鏈表 L
   LinkList p = L;
   while(p->next)
      p = p->next;
   LinkList temp = (LinkList)malloc(sizeof(LNode));
   temp->data = e;
   temp->next = NULL;
   p->next = temp;
   
   return OK;
}// CreateList

 

顯示單鏈表:

Status DispList(LinkList &L)
{    //顯示單鏈表 L
    LinkList p = L->next;
    int i = 0;
    while(p)
    {
        printf("%d\t", p->data);
        i ++;
        p = p->next;
    }
    return OK;
}// DispList

主食->INSERT操作:

Status Insert(LinkList &L, int i, int b)
{// 在無頭結點的單鏈表中的第 i 個元素前插入新元素 b
    LinkList p, q;
    p = L;
    q = (LinkList)malloc(sizeof(LNode));
    q->data = b;
    if( i==1 )
    {
        q->next = p;
        L = q;  // 插入在鏈表頭部
    }
    else
    {
        while( i>0 )
        {
            p = p->next;
            i --;
        }
        q->next = p->next;
        p->next = q;   // 插入在第 i 個元素之前
    }
    return OK;
}// Insert

main 函數:

int main()
{
    LinkList L;
    InitList(L);
    for(int i = 0; i < 10; i++)
        CreateList(L, i);
    printf("鏈表ha的元素有:\n");
    DispList(L);
    printf("\n在第 2 個位置前插入 4:\n");
    Insert(L, 2, 4);
    DispList(L);

    return OK;
}

運行結果示意圖:

 

說明:在有頭結點的單鏈表中插入刪除數據元素的操作是統一的,不像無頭結點的單鏈表中,還要區分是否插入到頭結點前邊。因爲無頭結點的單鏈表插入到頭結點前邊跟插入到其他位置不一樣,得寫成:

q->next = p;  // q 爲帶插入節點, p 爲第 i 個節點
L = q;        // 將指向頭結點的指針 L 指向新的頭結點 q

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章