鏈表初嘗試-鏈表的構建與輸出-指針

參考:鏈表基本操作的實現

代碼:

//鏈表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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章