第二章(線性表之離散儲存)

來源:互聯網
上載者:User
重點:練習單鏈表的初始化、尋找、插入、刪除操作,重點掌握建立鏈表的前插法和後插法兩種方法。
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);}
輸出結果:




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.