[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:編譯時處理,定義一個型別替代原有的型別。