參考:鍊錶基本操作的實現
**:
//鍊錶creat and output
#include
#include
#define len sizeof(struct student)
struct student
;int n;//統計節點數
struct student*creat(void)//返回乙個指向煉表頭的指標
//(4)end
p2->
next
=null;//最後的乙個節點的next置空
p1=null;
p2=null;
return(head);//返回struct student型別的頭指標
} void print(struct student*head)
}}int main()//主函式呼叫頭指標
一.用c語言實現乙個鍊錶的操作,首先定義乙個結構體作為節點,開闢節點的空間就需要用到stdlib庫里的malloc,使用malloc的時候,需要指明開闢空間的大小,我這裡define乙個len(1)為乙個結構體節點的大小,malloc開闢完以後返回的是void型別的指標,這裡我們強制轉換成結構體節點型別(2):
(1)#define len sizeof(struct student)
(2)p1=p2=(struct student *)malloc(len);//malloc返回乙個指向新開闢空間的指標
二.定義creat函式的型別為:struct student*
,定義乙個頭指標head指向單鏈表的首部(不要忘記對頭指標的操作,比如置null),定義p1,p2(1)。其中p1的功能是在「第一時間來到」新開闢的節點處,輸入該節點的值(2)。而p2則慢慢吞吞的走在p1後面,完成連線節點的作用(3),但是雖然p2走的很慢,它始終跟在p1的後面:
(1)struct student *p1,*p2;//指標型別:struct student
(2)p1=(struct student *)malloc(len);//p1繼續向下乙個節點移動
scanf("%ld%lf",&p1->num,&p1->score);//輸入下一節點的資料
(3)if(n==1)head=p1;//開始時頭指標指向首節點
else p2->next=p1;//每乙個節點含有乙個指向下乙個節點的指標
(4)p2=p1;//移動p2到p1的位置,準備進行對下乙個節點的操作(準備操作現在的這個節點的next指向下乙個節點)
三.當p1走到絕路時,(即輸入的是結束的象徵0 0),p2不會跟著傻,它會懸崖勒馬。
p2->next=null;//最後的乙個節點的next置空
p2->next
的置空象徵著鍊錶構建的結束。
構建部分**:
struct student*creat(void)//返回乙個指向煉表頭的指標
//(4)end
p2->
next
=null;//最後的乙個節點的next置空
p1=null;
p2=null;
return(head);//返回struct student型別的頭指標
}
void print(struct student*head)}}
傳入頭指標,定義乙個指標p,將鍊錶的首位址賦值給p(p=head
),然後輸出當前指向的節點的儲存值,然後指向下乙個節點,不斷的往復。最後當它遇見「懸崖」時「勒馬」。
指標與鍊錶
指標是乙個儲存計算機記憶體位址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數位址,例如int long和double。指標也可以是void型別 null指標和未初始化指標。根據出現的位置不同,操作符 既可以用來宣告乙個指標變數,也可以用作指標的取值。當用在宣告乙個變...
指標與鍊錶
真正有用的動態變數很少會是int,double這樣的簡單型別.相反都是一些複雜型別,比如陣列,結構體,或類.結構體或類型別的動態變數通常由乙個或多個成員變數,這些變數是指標,可將動態變數連線到其它動態變數.一.節點 在c 中,節點作為結構或類實現.struct listnode typedef li...
鍊錶的構建與排序
2.鍊錶的排序 給出若干個數,將數字儲存在鍊錶中,然後使用插入排序,按照公升序排列輸出數字。輸入乙個整數n表示有n個數,接著輸入這n個數。按照公升序輸出這n個數。5 3 2 4 5 4 2 3 4 4 5我沒有用插入排序 include include include typedef struct ...