#include <stdio.h>
//①定義鏈表數據結構
struct node
{
int num;
struct node *next;
};
//函數聲明
struct node *creat();
void print();
main( )
{
struct node *head;
head=NULL; //②建壹個空表
head=creat(head);/*創建單鏈表*/
print(head);/*打印單鏈表*/
}
/******************************************/
struct node*creat(struct node *head)/*返回的是與節點相同類型的指針*/
{
struct node*p1,*p2;
int i=1;
//③利用malloc ( )函數向系統申請分配壹個節點
p1=p2=(struct node*)malloc(sizeof(struct node));/*新節點*/
printf("請輸入值,值小於等於0結束,值存放地址為:p1_ADDR= %d\n",p1);
scanf("%d",&p1->num);/*輸入節點的值*/
p1->next=NULL;/*將新節點的指針置為空*/
while(p1->num>0)/*輸入節點的數值大於0*/
{
//④將新節點的指針成員賦值為空。若是空表,將新節點連接到表頭;若是非空表,將新節點接到表尾;
if(head==NULL)
head=p1;/*空表,接入表頭*/
else
p2->next=p1;/*非空表,接到表尾*/
p2=p1;
p1=(struct node*)malloc(sizeof(struct node));/*下壹個新節點*/
i=i+1;
printf("請輸入值,值小於等於0結束,值存放地址為:p%d_ADDR= %d\n",i,p2);
scanf("%d",&p1->num);/*輸入節點的值*/
//⑤判斷壹下是否有後續節點要接入鏈表,若有轉到3 ),否則結束;
}
//==============原來程序更正部分:(多謝@daling_datou提醒)================================
free(p1); //申請到的沒錄入,所以釋放掉
p1=NULL; //使指向空
p2->next = NULL; //到表尾了,指向空
printf("鏈表輸入結束(END)\n");
//==============================================
return head;/*返回鏈表的頭指針*/
}
/*******************************************/
void print(struct node*head)/*出以head為頭的鏈表各節點的值*/
{
struct node *temp;
temp=head;/*取得鏈表的頭指針*/
printf("\n\n\n鏈表存入的值為:\n");
while(temp!=NULL)/*只要是非空表*/
{
printf("%6d\n",temp->num);/*輸出鏈表節點的值*/
temp=temp->next;/*跟蹤鏈表增長*/
}
printf("鏈表打印結束!!");
}