重點:練習單鏈表的初始化、尋找、插入、刪除操作,重點掌握建立鏈表的前插法和後插法兩種方法。
1.單鏈表的儲存結構
//-----單鏈表的儲存結構-----
typedef struct LNode{
ElemType date;//結點的資料域
struct LNode *next;//結點的指標域
}LNode,*LinkList;//LinkList為指向LNode的指標類型
2.單鏈表基本操作的實現
//-----單鏈表的初始化-----
Status InitList_L(LinkList &L){//構造一個空的單鏈表L
L=new LNode;//產生新結點做為頭結點
L->next=NULL;//頭結點的指標域為空白
return OK;
}
//-----按序號尋找-----
Status GetElem_L(LinkList L,int i,ElemType &e){//在頭結的為L的單鏈表中尋找第i個元素
p=L->next;j=1;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i) return ERROR;//第i個元素不存在
e=p->date;
return OK;
}
//-----按值尋找-----
LNode *LocateElem_L(LinkList L, ElemType e){//在帶頭結點的單鏈表L中尋找值為e的元素
p=L->next;
while(p&&p->date!=e){
p=p->next;
}
return p;
}
//-----單鏈表的插入-----
Status LinkInsert_L(LinkList &L,int i,ElemType e){//在帶頭結的單鏈表L中第i個位置插入元素e
p=L;j=0;
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1) return ERROR;
s=new LNode;
s->date=e;
s->next=p->next;
p->next=s;
return OK;
}
//-----單鏈表的刪除-----
Status LinkDelete_L(LinkList &L,int i,ElemType &e){//刪除L的第i個元素,並賦給e
p=L,j=0;
while(p->next&&j<i-1){
p=p->next; ++j;
}
if(!(p->next)||j>i-1; return ERROR;//i大於表長+1或者小於1
q=p->next;
p->next=q->next;
e=q->date;
delete q;
return OK;
}
//-----前插法建立鏈表-----
void CreatList_F(LinkList &L, int n){//逆位序輸入n個元素的值,建立帶頭結點的單鏈表L
L=new LNode;
L->next=NULL;
for(i=n; i>0; --i){
p=new LNode;
cin>>p->date;
p->next=L->next; L->next=p;
}
}
//注意:前插法逆序輸入n個元素的值,結合圖示更易理解前插法。
圖示:
//-----後插法建立鏈表-----
void CreatList_L(LinkList &L,int n){//正位序輸入n個元素的值,建立帶頭結點的單鏈表L
L=new LNode;
L->next=NULL;
r=L;
for(i=0; i<n; i++){
p=new LNode;
cin>>p->data;
p->next=NULL;r->next=p;
}
}
總結:二者時間複雜度均為O(n),但是後插法較前插法更易理解,但前插法在特定情況也有它的用處,應熟練掌握。
題目描述:設計一個演算法,通過一趟遍曆,將鏈表中所有結點的連結方向逆轉且仍利用原表的儲存空間。
#include<iostream>using namespace std;typedef struct LNode{ int data; struct LNode *next;}LNode, *LinkList;void CreatList(LinkList L){//建立一個鏈表 LinkList p,q;//p、q為結構體指標類型 p=L;//建立頭結點L cout<<"輸入結點數量"<<endl; int n; cin>>n; for(int i=0; i<n; i++){ q=new LNode; cin>>q->data; p->next=q; p=q; } p->next=NULL; return;}void ReverseList(LinkList L){//使用前插法將結點順序逆轉且不改變儲存空間 LinkList p,q; p=L->next; L->next=NULL; while(p!=NULL){ q=p->next; p->next=L->next; L->next=p; p=q; } }void ListTraverse(LinkList L){//遍曆鏈表 LinkList p; p=L->next; while(p!=NULL){ cout<<p->data<<" "; p=p->next; } cout<<endl; return ;}int main(){ LNode L; CreatList(&L); ReverseList(&L); ListTraverse(&L); while(1);}輸出結果: