c语言-反转单向链表,C语言,运行出错

问题描述

反转单向链表,C语言,运行出错

#include
#include

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

typedef struct LNode{
int node;
struct LNode *next;
} LNode,*LinkList;

LinkList Head_Node()
{
LinkList head;
head=(LinkList)malloc(sizeof(LNode));
if(head==NULL)
{
printf("空间分配失败n");
return head;
}
head->next=NULL;
return head;
}

int CreateList(LinkList head)
{
int data;
char c;
LinkList p,q;
q=head;
printf("请输入数据:");
do
{
scanf("%d",&data);
c=getchar();
p=(LinkList)malloc(sizeof(LNode));
if(p==NULL)
{
printf("空间分配失败n");
return -1;
}
p->node=data;
p->next=q->next;
q->next=p;
q=p;
}
while(c!='n');
return 0;
}

LinkList Reverse(LinkList head)
{
LinkList p,q,r;
p=head;
q=head->next;
head->next=NULL;
if(q->next!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
q->next=p;
head->next=q;
return head;
}

void Output(LinkList head)
{
LinkList p;
p=head->next;
while(p)
{
printf("%d ",p->node);
p=p->next;
}
}

int main()
{
LinkList head;
head=Head_Node();
CreateList(head);
Reverse(head);
Output(head);
system("pause");
return 0;
}

解决方案

 #include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

typedef struct LNode{
    int node;
    struct LNode *next;
} LNode,*LinkList;

LinkList Head_Node()
{
    LinkList head;
    head=(LinkList)malloc(sizeof(LNode));
    if(head==NULL)
    {
        printf("空间分配失败n");
        return head;
    }
    head->node = -1;
    head->next=NULL;
    return head;
}

int CreateList(LinkList head)
{
    int data;
    char c;
    LinkList p,q;
    q=head;
    printf("请输入数据:");
    do
    {
        scanf("%d",&data);
        c=getchar();
        if(-1 == data)
            break;

        p=(LinkList)malloc(sizeof(LNode));
        if(p==NULL)
        {
            printf("空间分配失败n");
            return -1;
        }
        p->node=data;
        p->next=q->next;
        q->next=p;
        q=p;
    }
    //while(c == 10);//如果是这样你希望以什么方式退出(这里的10代表'n')?
    while(1);
    return 0;
}

//你的翻转函数有逻辑问题
LinkList Reverse(LinkList head)
{
    LinkList p,q,r;

    p = head->next;
    q = p->next;
    p->next = NULL;

    while(q->next!=NULL)
    {
        r=q->next;
        q->next=p;
        p=q;
        q=r;
    }
    q->next=p;
    head->next = q;

    return head;
}

void Output(LinkList head)
{
    LinkList p;
    p=head->next;
    while(p != NULL)
    {
        printf("%d ",p->node);
        p=p->next;
    }
    putchar(10);
}

int main()
{
    LinkList head;
    head=Head_Node();
    CreateList(head);
    Output(head);
    Reverse(head);
    printf("*********************************************************n");
    Output(head);
    //system("pause");
    return 0;
}

解决方案二:

Debug模式运行,然后在出错的地方加断点,看下内存,如果程序蹦了,看下堆栈调用

解决方案三:

Reverse函数,反转应该用的是while循环,但你用的是if
改成while,但仍需注意头节点和尾节点的处理,没有处理到位,肯定会出错,建议在纸上画一下流程

解决方案四:

代码太长,晕了,大致是哪个部分出问题了,请说明一下。

解决方案五:

主要是你反转的时候应该注意一下内存的问题

解决方案六:

给你写了个,你试试

    ListNode* reverseList(ListNode* head) {
         if(head==NULL || head->next==NULL)
            return head;
        ListNode* pre = NULL;
        ListNode* current = head;
        ListNode* post;

        ListNode* newhead;
        while(current!=NULL)
        {
            post = current->next;
            if(post==NULL)
            {
                newhead = current;
            }
            current->next = pre;
            pre = current;

            current = post;
        }

        return newhead;
    }
时间: 2024-11-05 16:31:10

c语言-反转单向链表,C语言,运行出错的相关文章

如何使用递归和非递归方式反转单向链表_C 语言

问题:给一个单向链表,把它从头到尾反转过来.比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a . 分析:假设每一个node的结构是: 复制代码 代码如下: class Node { char value; Node next;} 因为在对链表进行反转的时候,需要更新每一个node的"next"值,但是,在更新 next 的值前,我们需要保存 next 的值,否则我们无法继续.所以,我们需要两个指针分别指向前一个节点

一个c语言单向链表,编译通过,运行结果却不知所谓,请求帮助

问题描述 一个c语言单向链表,编译通过,运行结果却不知所谓,请求帮助 这段代码在rhel6中用gcc编译通过,运行结果未定义,其中作的链表按number大小排序打印出来是没有排过序的结果,而且输入记录多了,其中某些项的number打印出来会由输入的值变成0或者一个莫名其妙的整数. vs2008中编译通过,打入多项记录只能显示2条,而且前一条是乱码. 最简单的一个数据结构,却忙了半天还查不出原因,帮个忙吧-_-||| 原代码: /*简单单向链表,输入学生名称和号码,按号码排序, 如果号码相同则记录

C语言之单向链表详解及实例代码_C 语言

1,单向链简洁. 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指针成员变量指列表中的下一个结点:列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针: 2,例子要求: 根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入.删除以及查找,并支持单向链表的反转

如何使用递归和非递归方式反转单向链表

以下是对使用递归和非递归方式反转单向链表的示例进行了详细的分析介绍,需要的朋友可以过来参考下   问题: 给一个单向链表,把它从头到尾反转过来.比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a . 分析:假设每一个node的结构是: 复制代码 代码如下: class Node {  char value;  Node next; } 因 为在对链表进行反转的时候,需要更新每一个node的"next"值,但是,在更新

单链表-c语言单向链表的问题???

问题描述 c语言单向链表的问题??? #include<stdio.h>#include<stdlib.h>struct node{ int num; struct node *next;};//构建空的链表struct node* InitList(struct node *L){ L = (struct node*)malloc(sizeof(struct node)); L = NULL; printf_s(""InitList sucess!"

c语言-C语言中单向的链表反转?

问题描述 C语言中单向的链表反转? 这段代码实在看不懂啊,求解 Linklist *reverse(Linklist *head) //链表逆置 { Linklist *p,*t; p=head->next; t=p->next; p->next=NULL; while(t!=NULL) { p=t->next; t->next=head->next; head->next=t; t=p; } return head; } 其中之一:while中第二句head-&

C语言单向链表的表示与实现实例详解_C 语言

1.概述: C语言中的单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域.这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值. 如下图所示: 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接 一个单向链表的节点被分成两个部分.第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址.单向链表只可向一个方向遍历. 链表最基本的结构是在每个节点

单向链表的翻转

单向链表翻转,之前把这个问题想的太简单了,以为只要把数据域翻转过来就可以了,结果是筐了大瓢,下面举一个简单的例子说明: 假设有n个人站成一排,现在要把这n个人的站的顺序颠倒过来,那么就不能只把这n个人的身高颠倒过来,而是要把每一个人的位置颠倒过来,第一个人站到最后,第二个人站倒数第二,以此类推. 为了检验程序的正确性,这一次我们打印时不能再打印结点数据,而要打印结点.Java程序运行时,JVM为程序开辟了内存空间,每一个结点在栈中都有一个保存的位置,要注意的是,每次程序运行时某一个结点在内存中保

单向链表的方法优化

前几天写了一篇关于单向链表的实现方法,单向链表的具体实现在里面都有说明,见博客:http://cq520.iteye.com/blog/1853186 不过细心的朋友也许发现了,上次写的几个方法其实是存在漏洞的,插入方法与删除方法都不能操作第一个元素,而实际上操作第一个元素的方法与操作其他元素的方法是一样的,只是代码描叙上有些差异,原因在于:首结点不存在前结点对它的引用 优化之后的代码如下: Java代码 /** * 向链表中插入新元素的方法 * @param index 插入的位置 * @pa