連結串列學習---------------------------------------頭插法和尾插法建立連結串列並輸出資料
阿新 • • 發佈:2018-12-17
連結串列的運算時間效率分析
查詢:因為線性連結串列只能順序存取,即在查詢時要從頭指標找起,查詢的時間複雜度為
插入和刪除:因為線性連結串列不需要移動元素,只要修改指標,一般情況下時間複雜度為
但是,如果要在單鏈表中進行前插或者刪除操作,由於要從頭查詢前驅結點,所耗時間複雜度為
我覺得開頭很重要:
typedef struct LNode{
ElemType data; //資料域,ElemType作用和int一樣
struct LNode *next; //指標域
}LNode,*LinkList; //*LinkList為LNode型別的指標
注意:上式是一個巨集定義,相當於對結構體型別起了一個別名,LNode *與LinkList,兩者本質上是等價的。
只不過(1)通常習慣上用LinkList定義單鏈表,強調定義的是單鏈表的頭指標
(2)用LNode *定義指向單鏈表中任意結點指標變數
綜合(1)(2) LNode *p <==> LinkList p
注意區分指標變數結點變數兩個不同的概念,若用LNode *p語句定義,則p代表指標變數,*p代表結點變數
單鏈表的頭插法(前插法)圖示:
核心的程式碼有三句 :
p->data = a; //p為新生成的結點,並輸入資料值為a p->next = L->next //使新生成的結點的指標域始終指向空(開始頭指標的指標域即是空) L->next = p //L為頭結點,使新生成的新結點一直在頭結點的緊鄰後面
下面貼上完整的程式碼(輸入五個值,頭插法建立連結串列逆序輸出):
#include<iostream> #include<algorithm> #include<string.h> using namespace std; typedef struct LNode{ char data; //資料域 struct LNode *next; //指標域 }LNode,*LinkList; //*LinkList為LNode型別 void Reverse(LinkList &L,int n) { L = new LNode; //生成頭結點,用頭指標L指向它 L->next = NULL; //下面for迴圈是使用頭插法建立單鏈表 for(int i=0;i<n;i++) { LinkList p; p = new LNode; //生成新結點 cin>>p->data; //輸入元素值 p->next = L->next; //和下面一句一起插入到表頭 L->next = p; } //下面這個while迴圈的作用是輸出單鏈表中結點的值 while(L->next) { cout<<L->next->data<<" "; L->next = L->next->next; } } int main() { LinkList List; Reverse(List,5); return 0; }
執行結果:
單鏈表的頭插法(前插法)圖示:
核心程式碼四句:
p = new LNode; //生成新結點
cin>>p->data; //輸入資料值
p->next = NULL; //和下面一句一起實現插入到表尾的操作
r->next = p;
r = p; //r指向新的尾結點
完整程式碼的實現(輸入五個值,尾插法建立連結串列順序輸出):
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef struct LNode{
char data; //資料域
struct LNode *next; //指標域
}LNode,*LinkList; //*LinkList為LNode型別
LinkList r,p;
void print(LinkList &L,int n)
{
L = new LNode;
L->next=NULL;
r = L; //尾指標r指向頭結點
//下面for迴圈是使用尾插法建立單鏈表
for(int i=0;i<n;i++)
{
p = new LNode; //生成新結點
cin>>p->data; //輸入資料值
p->next = NULL; //和下面一句一起實現插入到表尾的操作
r->next = p;
r = p; //r指向新的尾結點
}
//下面這個while迴圈的作用是輸出單鏈表中結點的值
while(L->next)
{
cout<<L->next->data<<' ';
L->next = L->next->next;
}
}
int main()
{
LinkList lis;
print(lis,5);
return 0;
}
執行結果: