題目:
在無頭結點的動態單鏈表上實現線性表操作 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