#include<cstdio>
#include<cstdlib>
struct Node{
int val;
struct Node *next;
};
int main()
{
int k;
struct Node *head,*cur;
// int sizeInt=sizeof(int);
// int sizeStructNode=sizeof(struct Node);
// int sizeStructNodeStar=sizeof(struct Node*);
printf("sizeInt=%d\nsizeStructNode=%d\nsizeStructNodeStar=%d\n",sizeInt,sizeStructNode,sizeStructNodeStar);
head=(struct Node*)malloc(sizeof(struct Node));//head為鏈接頭
// head=NULL;
/*
一開始時,在declare了head之後以為要初始化。NULL是空指針常量,malloc申請內存成功了就會返回一個地址,如果賦值了NULL就會變成可能是0的地址。而且在struct指針上,賦值NULL的用法也不對。
*/
scanf("%d",&k);
if(head!=NULL) // 檢查是否為head配置內存成功,如果非NULL,則成功
{
head->val=k;
head->next=NULL;
}
cur=head; //cur為當前要處理的node
//以下while循環為讀入節點數據的同時動態創建node,邊讀入邊創建
while(scanf("%d",&k)==1)
{
if(k==-1) break; //讀到-1為讀入結束
struct Node *temp;
temp=(struct Node*)malloc(sizeof(struct Node));
//temp為新創node,存放當前的數據
if(temp!=NULL)
{
cur->next=temp; //把temp接到cur後面
temp->val=k; //把讀入的數據存到temp的value欄
temp->next=NULL;
//temp的next欄設為NULL(為最後的tail node結束做判斷)
cur=temp;
//這一句很重要,把temp賦值給cur,因為temp為cur的下一個node,所以這行相當於把cur往下移了一個node
}
}
//開始用下面這段時會有問題
/*
cur=head->next;
while(scanf("%d",&k)==1)
{
if(k==-1) break;
struct Node *temp;
temp=(struct Node*)malloc(sizeof(struct Node));
if(temp!=NULL)
{
cur->next=temp;
cur->val=k;
temp->next=NULL;
cur=temp;
}
}
cur=NULL; //這行要注意,用法有問題!
cur=head->next;
while(cur!=NULL)
{
printf("%d p=%p\n",cur->data,cur);
cur=cur->next;
}
之前的做法是在while循環里,用cur來存放當前的數據,temp為新declare并申請了內存的空node,接在cur的next上。然後按著node順序輸出時,用while(cur!=NULL)當作結束判斷條件會有問題,但是while(cur->next!=NULL)卻不會有問題。
【可能的原因】:next是指向struct的地址指針類型,所以它可以被賦值成NULL(就是空指針),但是head是一個結構體,它不是單純地一個指針類型,所以不能被賦值成NULL。
*/
/*下面是反轉鏈錶的代碼,整個過程用了previous,head,headNext三個node。反轉過程中會把鏈錶拆成兩段,previous就是前段的tail,head就是第二段的head node,headNext就是head的下一個node。
關係圖:previous->head->headNext
*/
struct Node *previous,*headNext;
previous=head; //previous是第一個
head=head->next; //head是第二個
headNext=head->next; //headNext是第三個
previous->next=NULL;
/*目前的previous是head,反轉之後就是tail,tail的next要設成NULL,為之後遍歷鏈錶的結束條件。這句也把head從原鏈錶成斷開了。
*/
while(head->next!=NULL)
{
head->next=previous;
previous=head;
head=headNext;
headNext=head->next;
}
head->next=previous;
//這裡的head就是反轉之後的head node
//下面部分是反轉後的鏈錶順序輸出node數據
cur=head;
printf("head=%d\n",head->val);
while(cur->next!=NULL)
{
struct Node *temp=cur;
printf("%d\n",cur->val);
cur=cur->next;
free(temp);
}
printf("tail=%d\n",cur->val);
return 0;
}
關於NULL的文章:
C 語言常見誤解/指標/空指標與NULL
C语言中的NULL总是被定义为0吗?NULL总是等于0吗?
c语言NULL和0区别及NULL详解