上期講解了靜態(tài)鏈表的實例,但是靜態(tài)鏈表建立的節(jié)點數量有限,畢竟是手工建立,難免也會出問題, 所以這期講講怎么使用動態(tài)的方式建立鏈表,也就是 動態(tài)鏈表 !
關鍵詞:動態(tài)鏈表;
01建立鏈表
1.1、建立動態(tài)鏈表
建立鏈表所需要的頭文件,代母如下:
#include
#include
#include
需要使用宏定義定義相關變量,代碼如下:
#define LEN sizeof(struct Student)//宏定義節(jié)點長度得命名
#define TYPE struct Student //宏定義結構體變量命名
需創(chuàng)建一個結構體,代碼如下:
struct Student //定義一個學生類型結構體,包括學號,分數
{
long num;
float score;
struct Student* next; //next是指針變量,指向結構體變量
};//指向結構體對象得指針變量既可以指向結構體變量,也可以指向結構體數組中得元素
建立鏈表函數,代碼如下:
TYPE* Creat(void) //定義函數,此函數返回一個指向鏈表頭的指針
{
TYPE* head; //定義頭指針
TYPE* p1,*p2; //定義兩個 指針變量用來相互保存
number = 0; //開始時,結點清零
p1 = p2 = (TYPE*)malloc(LEN); //創(chuàng)建存儲空間
printf("請按格式輸入學生學號,分數\\n"); //輸出提示信息
printf("例如101,1 并以0,0結束\\n");
scanf("%ld,%f", &p1->num, &p1->score);//按格式輸入第一個結點的信息
head = NULL; //第一個結點頭指針賦空值
while (p1->num!=0) //循環(huán)直到輸入學生學號為0,就結束
{
number++; //結點自增
if (number == 1) //如果只有一個結點,那么頭指針指向第一個輸入的結點
head = p1;
else
p2->next = p1;//如果大于1個,那么要用next保存前一個結點的信息
p2 = p1; //保存前一個結點信息
p1 = (TYPE*)malloc(LEN);//開辟新的結點
scanf("%ld,%f", &p1->num, &p1->score);//輸入下一個結點信息
}
p2->next = NULL; //循環(huán)結束,將指向信息賦空值
return (head); //返回首地址
}
需編寫主函數,代碼如下:
int main()
{
TYPE* pt; //定義一個結構體指針變量
pt = Creat(); //函數返回鏈表第一個結點的地址
printf("\\nnum:%ld\\nscore:%5.lf\\n", pt->num,pt->score);
//輸出第一個結點的成員值
return 0;
}
運行程序,最終結果顯示如圖1-1所示:
圖1-1 運行結果界面
圖1-1中首先按給定的提示方法,輸入信息,并以0,0結束輸入,最終通過打印的方式顯示輸出第一個節(jié)點的信息!
文中最后結果顯示的是第一個結點的內容,作為有強大功能的鏈表,對他的操作當然有許多,比如:鏈表的創(chuàng)建,修改,刪除,插入,輸出,排序,反序,清空鏈表的元素,求鏈表的長度等等!
02建立鏈表
2.1、鏈表的輸出
鏈表的的輸出可以使用循環(huán)打印就可以輸出整個鏈表的數據,輸出函數的代碼如下:
void print(TYPE * head)
{
TYPE * p; //定義指針
printf("\\nNOW These %d records are:\\n");//輸出顯示信息
p = head; //使p指向第一個結點
if(head!=NULL) //輸出第一個結點后的信息
do {
printf("%ld %5.1f\\n",p->num,p->score);
p = p->next; //指向下個結點
} while (p != NULL);
}
主函數的代碼如下:
int main()
{
TYPE * pt; //定義一個結構體指針變量
pt = Creat(); //函數返回鏈表第一個結點的地址
print(pt); //輸出調用
return 0;
}
鏈表的修改、刪除、插入有點理解費勁,所以留給下期講解,要弄懂鏈表還是推薦邊寫邊看,下期講解鏈表的修改、刪除、插入!
評論
查看更多