| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 513 人关注过本帖
标题:链表逆置问题
只看楼主 加入收藏
z8869113
Rank: 2
等 级:论坛游民
帖 子:44
专家分:14
注 册:2010-12-14
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:7 
链表逆置问题
这个问题我看下论坛也有很多的解答,可是我对比之后还是不明白我错哪里了~

求前辈们给指导啊~

先谢过了~

#include<stdio.h>
typedef struct stu
{
    int a;
    struct stu *next;
}STU;

void main()
{
    int n,i;
    STU *p,*head,*q;
    p=head=new STU;

    scanf("%d",&n);
    /*建立链表*/
    for(i=0;i<n;i++)
    {
        scanf("%d",&p->a);

        p->next=new STU;
        p=p->next;
   
    }
    /* 输出链表 */
    for (p = head; p != NULL; p = p->next)
        printf("%d", p->a);
    printf("\n");

    /* 逆置链表 */
    p = head;
    head = q = NULL;
    while (p != NULL)
    {
        if (head == NULL)
        {
            head = p;
            p = p->next;
            head->next = NULL;
        }
        else
        {
            q = p->next;
            p->next = head;
            head = p;
            p = q;
        }
    }
   
    /* 输出链表 */
    for (p = head; p != NULL; p = p->next)
        printf("%d", p->a);
    printf("\n");


        
        
   
   
   

   
}

搜索更多相关主题的帖子: next head include next head include 
2011-09-11 21:42
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:0 
p=head=new STU;
这个new是怎么回事?

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-09-11 22:24
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:20 
void main()
{
    int n,i;
    STU *p,*head,*q;
    scanf("%d",&n);
    if (n <=0) {
        return;
    }     

    /*建立链表*/
    for(i=0;i<n;i++)
    {  
        if (i == 0) { // 第一次时候,是初始化链表头
            p=head=new STU;
        }
        else {         // 之后就可以直接在链表的末端来加入节点了
            p->next = new STU;
            p = p->next;
        }
        p->next = NULL;// 这个不可以少,否则会出错(访问非法内存),

        scanf("%d",&p->a);
    }

    /* 输出链表 */
    p = head;
    while (p != NULL) { // 用这个结构清晰一点
        printf("%d ", p->a);
        p = p->next;
    }

    printf("\n");


    /* 逆置链表 */
    p = head->next;
    head->next  = NULL;
   
    while (p != NULL) {
        q = p->next; // 保存下一个节点
        p->next = head;
        head = p;

        p = q;
    }     

    /* 输出链表 */
    p = head;
    while (p != NULL) { // 用这个结构清晰一点
        printf("%d ", p->a);
        p = p->next;
    }   

    printf("\n");                 
}

最好命名不要用 p q 什么的,用个有意义的名字

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2011-09-11 22:33
z8869113
Rank: 2
等 级:论坛游民
帖 子:44
专家分:14
注 册:2010-12-14
收藏
得分:0 
回复 2楼 pauljames
开辟新空间给head然后p指向head吧- -
2011-09-11 22:45
z8869113
Rank: 2
等 级:论坛游民
帖 子:44
专家分:14
注 册:2010-12-14
收藏
得分:0 
回复 3楼 yuccn
恩,先谢过了~

编译通过~成功!
解释好详细~谢谢啦~

以后我会多注意变量的意思的
2011-09-11 22:56
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<malloc.h>
struct Node
{
        int value;
        struct Node * next;
};

typedef Node * LinkList;

void insert( LinkList *list, int value)
{
        if(  list == NULL)
        {
                Node * node= (Node*) malloc(sizeof(Node));
                node->value=value;
                node->next = NULL;
                *list =  node;
        }
        else
        {
                Node * head  = (Node *)malloc ( sizeof(Node));
                head->value = value;
                head->next=*list;
                *list = head;
        }
}       

void walk(LinkList list)
{
        Node * p = list;
        while( p )
        {
                printf("%d " , p->value);
                p = p->next;
        }
        printf("\n");
}

 
LinkList reverse( LinkList * list)
{
        LinkList tail;
        if ( NULL == list || NULL == (*list)->next)
                return *list;

        tail = reverse( & ((*list)->next));
        (*list)->next->next = *list;
        (*list)->next = NULL;
        return tail;
}

void destroy(LinkList *list)
{
        if ( *list == NULL)
                return;
        else
        {
                while((*list))
                {
                        free(*list);
                        *list = (*list)->next;
                }
                list = NULL;
        }
}

int main()
{
        int i;
        LinkList list = NULL;
        for ( i = 0 ; i < 3; i ++ )
        {
                insert(&list,i);
        }
        walk(list);
        list = reverse(&list);
        walk(list);
        destroy(&list);
}
2011-09-12 01:19
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 6楼 Devil_W
1.
void insert( LinkList *list, int value)
{
        if(  list == NULL) // 按你的代码,这个分支永远没有办法执行
        {
                Node * node= (Node*) malloc(sizeof(Node));
                node->value=value;
                node->next = NULL;
                *list =  node;
        }
        else
        {
                Node * head  = (Node *)malloc ( sizeof(Node));
                head->value = value;
                head->next=*list;
                *list = head;
        }
}

if (list == NULL) 应该改成 if(*list == NULL)吧

2.
void destroy(LinkList *list)
{
    if ( *list == NULL)
        return;
    else
    {
        while((*list))
        {
            free(*list);  // 这个时候已经free list,下一句还 *list = (*list)->next;??访问(*list)->next 会出错的
            *list = (*list)->next;
        }
        list = NULL; // 按你的逻辑 这个也应该是 *list = NULL。而不是list = NULL
    }
}

应该改成
void destroy(LinkList *list)
{
    if (list == NULL) {
        return;
    }

    Node *pDelete = *list;
    *list = NULL;

    while(pDelete != NULL) {
        Node *pNext = pDelete->next;
        free(pDelete);
        pDelete = pNext;
    }
}

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2011-09-12 11:21
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
回复 7楼 yuccn
恩,确实是有问题的。

析构改成了递归。


程序代码:
#include<stdio.h>
#include<malloc.h>
struct Node
{
        int value;
        struct Node * next;
};

typedef Node * LinkList;

void insert( LinkList *list, int value)
{
        if(  *list == NULL)
        {
                Node * node= (Node*) malloc(sizeof(Node));
                node->value=value;
                node->next = NULL;
                *list =  node;
        }
        else
        {
                Node * head  = (Node *)malloc ( sizeof(Node));
                head->value = value;
                head->next=*list;
                *list = head;
        }
}

void walk(LinkList list)
{
        Node * p = list;
        while( p )
        {
                printf("%d " , p->value);
                p = p->next;
        }
        printf("\n");
}

LinkList reverse( LinkList * list)
{
        LinkList tail;
        if ( NULL == list || NULL == (*list)->next)
                return *list;

        tail = reverse( & ((*list)->next));
        (*list)->next->next = *list;
        (*list)->next = NULL;
        return tail;
}

void destroy(LinkList *list)
{
        if ( *list == NULL )
                return;
        else
        {
                destroy(&(*list)->next);
        }
        free((*list));
        *list = NULL;
}

int main()
{
        int i;
        LinkList list = NULL;
        for ( i = 0 ; i < 3; i ++ )
        {
                insert(&list,i);
        }
        walk(list);
        list = reverse(&list);
        walk(list);
        destroy(&list);
}
2011-09-12 13:12
快速回复:链表逆置问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022188 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved