經過結構體,創建動態鏈表,並輸出鏈表

/*****************
*
經過結構體,創建動態鏈表,並輸出鏈表。
*
*******************/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(struct student)  //宏定義 將LEN 替換爲student 結構體的大小數值

struct student *create();  //聲明建立新鏈表(節點)(結構體)函數,返回該鏈表的頭地址(指針),(尾部添加節點方法)

void print(struct student *head); // 打印鏈表函數(此處爲函數聲明,
                                 //print函數()內的形參無關緊要,有則主要給編程人員看的)

struct student     //定義結構體類型,即每一個建立的節點(結構體)內包含什麼類型的數據

{
 long num;
 float score;
 struct student *next;  //用來鏈接下一個結構體的指針
};

int n; //全局變量,用來記錄建立了多少個結構體

void main()
{
 struct student *stu; //定義一個指針類型的結構體stu
 stu = create(); //調用建立新節點(結構體)函數create()並將其建立成的鏈表頭地址(指針)賦給stu指針
 print(stu); //用create()返回的指針做實參調用函數print()
 printf("\n\n");
 system("pause");  //此處system函數()內帶雙引號,中文的任意鍵退出提示
}

struct student *create()  //定義創捷指針結構體的函數
{
 struct student *head; // 定義指針結構體變量*head, *p1,*p2,用於存放新建立的指針結構體
 struct student *p1,*p2;
 p1 = p2 = (struct student *)malloc(LEN); //LEN是student結構體的大小
                //用動態內存分配函數malloc()分配內存給指針結構體p1和p2
 printf("please enter the num : "); //指針結構體p1先得到數據
 scanf("%ld",&p1->num);
 printf("please enter the score : ");
 scanf("%f",&p2->score);
 head = NULL;  //定義頭指針爲空值
 n = 0;    //初始話計數器
 
 while(p1->num) //判斷指針結構體p1成員所得到的數據是否爲0,否時(即表示p1獲取數據成功)則繼續一下執行
 {
  n++;  // 節點建立記數器+1
  if(1==n)  //當建立的爲第一節點時,
  {
   head = p1; //將指針結構體p1的首地址賦給指針接頭體head(即讓頭指針結構體指向p1)
  }
  else  //如果第一個以後建立的指針接頭體
  {
   p2->next = p1; //將p2指針結構體尾地址指向指針結構體p1首地址
  }
  p2 = p1; //讓p2指向p1,爲後續p1的重新獲取數據步驟做備份
  p1 = (struct student *)malloc(LEN); //再次使用動態內存分配函數給p1指針結構體分配特定的內存空間(此時即爲再次建立新節點(指針結構體))

  printf("\nPlease enter the num :");  //新指針結構體p1得到數據
  scanf("%d",&p1->num);
  printf("\nPlease enter the score :");
  scanf("%f",&p1->score);
 }  
 p2->next = NULL;  //當循環不執行(即p1->num,得到0值時) 將p2指針結構體成員 p2->next指向NULL即0,表示鏈表的結束

 return head;  //函數struct student *create() 返回鏈表的頭地址。
}

void print(struct student *head)  //定義print函數,接收鏈表頭地址(實參),執行運行,此處的形參(類型和名稱)必需要有
{
      struct student *p;   // 定義一個新的指針結構體變量p
      printf("\nThere are %d records!\n\n", n);
      p = head;  //所定義的新的p是用於接收函數struct student *create()返回回來的鏈表頭地址,此地址在print函數內用head這個指針來傳遞
      if( p )  //判斷鏈表的頭地址是否爲空,(即有沒有建立一個新的節點(指針結構體))
      {        
            do
            {
                  printf("學號爲 %d 的成績是: %f\n", p->num, p->score);//注意指針結構體的成員引用格式:指針結構體名->成員名;
         //將頭地址(指針接頭體struct student *head) 的成員打印出來

                  p = p->next;  //將頭地址(指針接頭體struct student *head) 指向下一節點頭地址。
                               //尾成員存放的地址(p->next內的地址即爲下一個節點(指針結構體)的頭地址)

            }while( p ); //直到p值爲NULL,(即0),退出循環。

      }

}
相關文章
相關標籤/搜索