反轉鏈錶

#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;    
        //tempnext欄設為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详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值