【问题标题】:Singly linked list doesn't seem to work单链表似乎不起作用
【发布时间】:2013-03-23 04:52:39
【问题描述】:

我正在玩链接列表以适应它,但我无法让这个小程序工作。我不知道这里出了什么问题,求助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//Struct
struct Node {
    int value;
    struct Node *next;
};
typedef struct Node NODE;

//Function Declaration
NODE* addNode (NODE* pList, NODE* pPre, int data);
void printList (NODE* pList);

int main (void)
{
    //Local Declaration
    NODE *pPre;
    NODE *pList;

    //Statement
    pList = addNode (pList, pPre, 10);
    pList = addNode (pList, pPre, 20);
    pList = addNode (pList, pPre, 30);

    printList (pList);
    return 0;
}

NODE* addNode (NODE* pList, NODE* pPre, int data)
{
    //Local Declaration
    NODE* pNew;

    //Statement
    if (!(pNew = (NODE*)malloc(sizeof(NODE))))
    {
        printf("\aMemory overflow in insert\n");
        exit(1);
    }

    pNew->value = data;
    if (pPre == NULL)
    {
        //Inserting before first node or to empty list.
        pNew->next = pList;
        pList = pNew;
    }
    else
    {
        pNew->next = pPre->next;
        pPre->next = pNew;
    }
    return pList;
}
void printList (NODE* pList)
{
    //Local Declaration
    NODE* pNew;

    //Statement

    pNew = pList;
    while(pNew)
    {
        printf("%d", pNew->value);
        pNew = pNew->next;

    }
    return;
}

pPre 是前驱节点,pList 是指向链表的指针。

【问题讨论】:

  • return;?返回什么?
  • @gongzhitaao,我不确定我是否关注。那是在返回 void 的函数中 - 有什么问题?
  • @CarlNorum,检查编辑历史;-)(点击“已编辑”指示符后的时间戳)

标签: c list linked-list


【解决方案1】:

您还没有将 NULL 分配给指针 pPrePList,试试下面的代码,它运行正常。现在,

NODE *pPre=NULL;
NODE *pList=NULL;

【讨论】:

  • 此代码基于我正在阅读的教科书。我们不需要定义pPre 是什么吗?以便编译器知道它是什么
  • NODE *pPre 实际上是 struct Node * pPre 因为 typedef 语句。
  • 这将使NODE *pPre。我认为这就是使用typedef 的全部意义所在
  • @ProgrammingNerd 您的教科书做出了一个(非常危险的)假设,即局部变量将自动初始化为 NULL。这并不总是得到保证。要正确初始化列表,逻辑要求这些指针以 NULL 开头。正如这个答案所说,将它们初始化为 NULL 是一种安全(并且强烈推荐!)的方法,以确保您的变量始终具有您期望(并且需要!)的值。
【解决方案2】:

根据您的代码逻辑,您希望 addNode() 修改 pPre。所以需要将 pPre 定义为 Node * 的指针。

Node * addNode(Node *pList, Node **pPre, int data)

而且 addNode() 应该返回 pList,你可能会错过它。

【讨论】:

  • 我只看到它在 *pPre 中改变值(作为 pPre->...),而不是 pPre 本身,所以它应该像最初声明的那样工作。他们可以使用 Node **ppList 声明它(以及其他适当的更改),并且能够直接修改列表头指针,而不是返回新值并依赖调用者来更新它......但这只是一种替代方法; return pList 方法有效 - 正如您在最后指出的那样进行更正。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2016-02-01
相关资源
最近更新 更多