1. 程式人生 > >[C++]指標和引用(四)

[C++]指標和引用(四)

指標和引用

用指標處理連結串列

一、連結串列概述

 

連結串列是由一個個結點組成,每一個結點是一個結構體型別的變數,各個結點的型別相同,但其地址不一定連續。具體結點的個數根據需要動態開闢。

每個結點由兩部分組成,第一部分放若干資料,第二部分是指標變數,放下一結點的地址。連結串列頭是一指標變數,放第一個結點的地址,若結點的第二部分的值為NULL,表示此連結串列結束。

二、如何處理連結串列

1、建立連結串列

struct  student

{   int  num;

     float  score;

     struct  student  *next;     指向同一結構體型別的指標變數

} ;

#define   STU  struct  student

STU

{   int  num;

     float  score;

     STU   *next;   指向同一結構體型別的指標變數

} ;

例:

struct  student

{   int  num;

     float  score;

     struct  student  *next;

} ;

 

struct student  *p;  //定義了結構體型別的指標

p=new student;  //用new開闢一結構體空間,將地址賦給p

p->num=10;   //為新開闢的結構體空間中的num成員賦值

p->score=90;

 

1、首先定義兩個結構體型別的指標   STU   *p1, *p2;

2、用new在記憶體中開闢一個結構體變數的空間,將地址賦給p1。

     p1=new student; /*  STU  struct  student    */

3、將資料賦給剛開闢的變數空間。

     cin>>p1->num>>p1->score;

4、若輸入的資料有效,將首地址作為連結串列頭,head=p1; 令p2=p1,p1繼續用new開闢新的記憶體空間。

     p1=new student; /*  STU  struct  student    */

5、將下一個資料賦給新開闢的變數空間。

     cin>>p1->num>>p1->score;

6、若輸入的資料有效,將p2與p1連線起來,p2->next=p1  再令p2=p1,p1繼續用new開闢新的記憶體空間。做5。若輸入的資料無效,p2就是連結串列的尾,則p2->next=NULL。

2、輸出連結串列

void print(STU  * head)

{  STU   *p;

    p=head;

    while(p!=NULL)

    {  cout<<p->num<<‘\t’<<p->score<<‘\n’;

        p=p->next;     //p指向下一結點

     }

}     

3、刪除連結串列

1、首先定義兩個結構體型別的指標   STU   *p1, *p2;

2、將連結串列的表頭賦給p1,  p1=head;

3、判斷p1所指向的結點是否是要刪除的結點   p1->num     a1。

4、若p1->num!=a1, p2=p1; p1指向下一個結點p1=p1->next,繼續判斷下一個結點是否是要刪除的結點。繼續做3。

5、若p1->num= =a1,則p1當前指向的結點就是要刪除的結點,將p2的指標成員指向p1所指的下一個結點。

這樣就刪除了一個結點。

特殊情況:

1、若連結串列為空連結串列,返回空指標。

2、刪除的結點為頭結點時,head指向下一個結點

3、連結串列內沒有要刪除的結點,返回提示資訊。

4、插入結點:要插入結點的連結串列是排序的連結串列。插入10。

 

1、定義三個結構體指標變數   STU  *p1,*p2,*p0;  p0指向要插入的結點。p1=head;

2、比較p1->num 與p0->num,若p1->num<p0->num,p2=p1; p1=p1->next;    繼續比較。

3、若p1->num> =p0->num,p0應插在p1與p2之間,則p2->next=p0 ;          p0->next=p1;

特殊情況:

1、若連結串列為空連結串列,將插入結點作為唯一的結點,head=p0;返回。

2、若插入結點中的資料最小,則插入的結點作為頭結點。

p0->next=head;  

head=p0;

3、插入到鏈尾,插入結點為最後一個結點。

p2->next=p0;

p0->next=NULL;

用typedef定義型別

typedef定義新的型別來代替已有的型別。

typedef     已定義的型別     新的型別

typedef     float    REAL

REAL    x, y;    =====>      float    x, y;

1、typedef可以定義型別,但不能定義變數。

2、tyoedef只能對已經存在的型別名重新定義一個型別名,而不能建立一個新的型別名。

1、先按定義變數的方法寫出定義體

2、把變數名換成新型別名

3、在前面加typedef

4、再用新型別名定義變數

typedef:編譯時處理,定義一個型別替代原有的型別。