链接列表仅打印第一个列表的第一个值

时间:2015-10-24 03:33:54

标签: c linked-list

我有一个程序,其中三个值插入到链接列表中。当我尝试遍历列表时,我只获得打印的第一个值。很抱歉,如果功能名称令人困惑,我还是c的新手,我试图使用这个功能和变量名称让我只是为了让我的生活更轻松。我也非常不熟悉调试器以及如何使用它来了解这里发生了什么。提前谢谢。

void program_header(char i[]);
Node *allocateNode(int iNewInfo);
Node *searchLL(Node *pHead, int iMatch, Node **ppPrecedes);
Node *insertLL(Node **ppHead, int iNewInfo);
void printLL(Node *pHead);

int main(int argc, char *argv[])
{   
    program_header(argv[0]);
    insertLL(&pHead, 84);
    insertLL(&pHead, 45);
    insertLL(&pHead, 81);
    printLL(pHead);

    return 0;
}

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

typedef struct Node
{
    int iInfo;
    struct Node *pNext;
}Node;

Node *pHead = NULL;
Node *pNew  = NULL;
Node *pPrecedes = NULL;

Node *allocateNode(int iNewInfo)
{
    // to allocate a new node
    pNew = malloc(sizeof(Node));
    if (pNew == NULL)
        printf("Memory allocation error");
        pNew->iInfo = iNewInfo;
        pNew->pNext = NULL;
    return pNew;
}

Node *searchLL(Node *pHead, int iMatch, Node **ppPrecedes)
{
Node *p;
for (p = pHead; p != NULL; p = p->pNext)
{
if (iMatch == p->iInfo)
    printf("Found! %d\n", iMatch);
    return p;
    if (iMatch < p->iInfo)
        return NULL;
    *ppPrecedes = p;
}
return NULL;
}

Node *insertLL(Node **ppHead, int iNewInfo)
{

Node *pFind;    
// see if it already exists
pFind = searchLL(*ppHead, iNewInfo, &pPrecedes);
if(pFind != NULL)
   return pFind;

// Doesn't already exist.  Allocate a node and insert it
pNew = allocateNode(iNewInfo);
if(pPrecedes == NULL)
{     //insert at head
      pNew->pNext = *ppHead;
      *ppHead = pNew;
}
else
{     //insert after a node
      pNew->pNext = pPrecedes->pNext;
      pPrecedes->pNext = pNew;
}
return pNew; 
}

void printLL(Node *pHead)
{
    Node *p;
    printf("iInfo Values\n");
    for (p = pHead; p != NULL; p = p->pNext)
    {
        printf("%d\n", p->iInfo);
    }
        p = pHead;
}

void program_header(char i[])
{   

    int j, n = strlen(&i[2]);
    char *name = &i[2], border[n], dash = '-';

    // loads dashes into array
    for(j = 0; j < n; j++)
        border[j] = dash;
    border[j] = '\0';

    // print header
    printf("\n~%s~\n~%s~\n~%s~\n\n"
        , border, name, border);
}

2 个答案:

答案 0 :(得分:1)

我相信您的问题出在搜索方法中。我重新格式化它以显示它当前的行为方式。为了帮助您使代码更具可读性并避免这些类型的错误,您应该养成在if语句中使用大括号的习惯,即使它们只是一行。

这是您当前的代码

Node *searchLL(Node *pHead, int iMatch, Node **ppPrecedes)
{
    Node *p;
    for (p = pHead; p != NULL; p = p->pNext)
    {
        if (iMatch == p->iInfo)
        {
            printf("Found! %d\n", iMatch);
        }

        return p;

        if (iMatch < p->iInfo)
        {
            return NULL;
        }
        *ppPrecedes = p;
    }
    return NULL;
}

请注意,在for循环中,无论是否找到匹配项,您始终都会返回p,这是pHead。然后在插入代码中,您将检查是否在列表中找到该项目。由于您始终返回头部,因此认为该项目位于列表中,并且从不添加新项目。

我还没有对此进行过测试,但我相信这是您需要做出的改变。如果值已在列表中,您期望搜索返回节点。因此,如果匹配,您希望返回p,否则您想要返回NULL

Node *searchLL(Node *pHead, int iMatch, Node **ppPrecedes)
{
    Node *p;
    for (p = pHead; p != NULL; p = p->pNext)
    {
        if (iMatch == p->iInfo)
        {
            printf("Found! %d\n", iMatch);
            return p;
        }

        if (iMatch < p->iInfo)
        {
            return NULL;
        }
        *ppPrecedes = p;
    }
    return NULL;
}

答案 1 :(得分:0)

纠正这个

Node *allocateNode(int iNewInfo)
{
    // to allocate a new node
    pNew = malloc(sizeof(Node));
    if (pNew == NULL)
        printf("Memory allocation error");
        pNew->iInfo = iNewInfo;
        pNew->pNext = NULL;
    return pNew;
}

到这个

Node *allocateNode(int iNewInfo)
{
    // to allocate a new node
    pNew = malloc(sizeof(Node));
    if (pNew){
        pNew->iInfo = iNewInfo;
        pNew->pNext = NULL;
   }else{
        printf("Memory allocation error");
   }
    return pNew;
}