參考:鏈表基本操作的實現
代碼:
//鏈表creat and output
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{
long num;
double score;
struct Student * next;
} ;
int n;//統計節點數
struct Student*creat(void)//返回一個指向鏈表頭的指針
{
struct Student * head;
struct Student *p1,*p2;//指針類型:struct Student
n=0;
//(begin)
p1=p2=(struct Student *)malloc(LEN);//malloc返回一個指向新開闢空間的指針
scanf("%ld%lf",&p1->num,&p1->score);//輸入節點的數據
head=NULL;//此時鏈表爲空
while(p1->num!=0 && p1->score!=0)//開始構建鏈表 輸入0 0時結束
{
//(1)
n++;//節點數增加
if(n==1)head=p1;//開始時頭指針指向首節點
else p2->next=p1;//每一個節點含有一個指向下一個節點的指針
//(2)
p2=p1;//移動p2到p1的位置,準備進行對下一個節點的操作(準備操作現在的這個節點的next指向下一個節點)
//(3)
p1=(struct Student *)malloc(LEN);//p1繼續向下一個節點移動
scanf("%ld%lf",&p1->num,&p1->score);//輸入下一節點的數據
}
//(4)end
p2->next=NULL;//最後的一個節點的next置空
p1=NULL;
p2=NULL;
return(head);//返回struct Student類型的頭指針
}
void print(struct Student*head)
{
struct Student*p;
p=head;
if(head!=NULL)
{
while(p!=NULL)//鏈表節點next指針指向NULL時結束
{
printf("%ld %lf\n",p->num,p->score);
p=p->next;
}
}
}
int main()//主函數調用頭指針
{
struct Student * p;
p=creat();//返回的是鏈表第一個節點的地址
printf("\nnum:%ld\nscore:%f\n",p->num,p->score);//輸出第一個節點的成員值
print(p);//輸出鏈表中的元素
return 0;
}
構建部分:
一.
用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)//返回一個指向鏈表頭的指針
{
struct Student * head;
struct Student *p1,*p2;//指針類型:struct Student
n=0;
//(begin)
p1=p2=(struct Student *)malloc(LEN);//malloc返回一個指向新開闢空間的指針
scanf("%ld%lf",&p1->num,&p1->score);//輸入節點的數據
head=NULL;//此時鏈表爲空
while(p1->num!=0 && p1->score!=0)//開始構建鏈表 輸入0 0時結束
{
//(1)
n++;//節點數增加
if(n==1)head=p1;//開始時頭指針指向首節點
else p2->next=p1;//每一個節點含有一個指向下一個節點的指針
//(2)
p2=p1;//移動p2到p1的位置,準備進行對下一個節點的操作(準備操作現在的這個節點的next指向下一個節點)
//(3)
p1=(struct Student *)malloc(LEN);//p1繼續向下一個節點移動
scanf("%ld%lf",&p1->num,&p1->score);//輸入下一節點的數據
}
//(4)end
p2->next=NULL;//最後的一個節點的next置空
p1=NULL;
p2=NULL;
return(head);//返回struct Student類型的頭指針
}
輸出部分:
void print(struct Student*head)
{
struct Student*p;
p=head;
if(head!=NULL)
{
while(p!=NULL)//鏈表節點next指針指向NULL時結束
{
printf("%ld %lf\n",p->num,p->score);
p=p->next;
}
}
}
傳入頭指針,定義一個指針p,將鏈表的首地址賦值給p(p=head
),然後輸出當前指向的節點的存儲值,然後指向下一個節點,不斷的往復。最後當它遇見“懸崖”時“勒馬”。
2016/3/20