当前位置: 首页 > 知识库问答 >
问题:

在双链表中不能从尾部到头部遍历

郑承恩
2023-03-14

我用C语言编写了双重链接列表的代码,它从头到尾的遍历很好,但从尾(end)到头的遍历陷入了无限循环,只打印最后一个节点的数据,我不知道出了什么问题。

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

struct node {
    int data;
    struct node *prev;
    struct node *next;
};
typedef struct node list;

list *head, *current, *newn, *end;

int main() {
    int x, y;
    current = (list*)malloc(sizeof(list));
    printf("enter data:");
    scanf("%d", &current->data);

    current->next = NULL;
    current->prev = NULL;
    head = current;
    printf("do you want to enter more:");
    scanf("%d", &x);
    while (x == 1) {
        current->next = (list*)malloc(sizeof(list));
        printf("enter data:");
        scanf("%d", &current->next->data);
        current->next->prev = current->next;
        current->next->next = NULL;
        current = current->next;
        end = current;
        printf("do yo want to enter more:");
        scanf("%d", &x);
    }

    newn = head;
    while (newn != NULL) {
        printf("%d:%d:%d->", newn->prev, newn->data, newn->next);
        newn = newn->next;
    }
    while (end->prev != NULL) {
        printf("%d", end->data);
        end = end->prev;
    }
}

共有1个答案

郤令
2023-03-14

将来自评论的答案放在一起,下面是固定的代码:

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *prev;
    struct node *next;
};
typedef struct node list;
list *head, *current, *newn, *end;

void exitWithFail() {
   printf("Error: exiting.\n");
   exit(1);
}

int main()
{
    int x,y,r;
    current = (list*)malloc(sizeof(list));
    printf("enter data:");
    r = scanf("%d",&current->data);
    if (r != 1) exitWithFail();
    current->next = NULL;
    current->prev = NULL;
    head = end = current;
    printf("do you want to enter more:");
    r = scanf("%d",&x);
    if (r != 1) exitWithFail();
    while(x == 1)
    {
        current->next = (list*)malloc(sizeof(list));
        printf("enter data:");
        r = scanf("%d",&current->next->data);
        if (r != 1) exitWithFail();
        current->next->prev = current; // problem No.1
        current->next->next = NULL;
        current = current->next;
        end = current;
        printf("do yo want to enter more:");
        r = scanf("%d",&x);
        if (r != 1) exitWithFail();    
    }
    newn = head;

    while(newn != NULL)
    {
        printf("%d ",newn->data);
        newn = newn->next;
    }
    printf("\n");
    while(end != NULL)     // Problem No. 2
    {
        printf("%d ",end->data);
        end = end->prev;
    }
    printf("\n");
}
 类似资料:
  • 我第一次使用链表,必须创建一个可以在双链表末尾插入节点的函数。到目前为止我 Node类按顺序接受要存储的值、要指向的下一个指针的值和上一个指针的值。每当我试图在这里插入节点时,我都会得到一个错误,说有一个未处理的异常,并且在写入位置0x00000008时有访问冲突。 我不完全确定这里出了什么问题,但我认为这与根据错误消息取消引用空指针有关。我真的很感激有人帮忙解决这个问题。

  • 题目链接 牛客网 题目描述 从尾到头反过来打印出每个结点的值。 解题思路 1. 使用递归 要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。 // java public ArrayList printListFro

  • 我目前正在为Java中的循环链表工作。我们应该能够在列表的前面插入和后面插入。但是,我已经让这些方法在循环链表类中正常工作。 我得到的结果是 对于第二次插入,这里的next指向null应该指向列表的头部。 节点类 循环链表类 主班

  • 我有两个循环双链表,与head和integer元素(无序)相连。要删除的第一个列表中包含第二个列表中的值。你的工作怎么样?如何排除这种情况?需要搜索第一个列表中的值才能删除第二个列表?我怎样才能和他们合作?你能解释一下解决这个问题的算法吗? 例如: 我有两个循环的双链表,带有head。 L1:40100902003266 L2:60146308090 我想删除第一个列表中第二个列表中的值。第一个列

  • 一、题目 输入个链表的头结点,从尾到头反过来打印出每个结点的值。 二、解题思路 使用栈的方式进行。 将链表从头到尾压入栈内,出栈的过程就对应着从尾到头。 三、解题代码 public class Test { /** * 结点对象 */ public static class ListNode { int val; // 结点的值

  • 所以我从一次考试中得到了这个问题。 在单链表中,如何从尾部获得第n个节点? 这样对吗?有没有更好的解决办法?