【问题标题】:Linked list with function resulting in infinite loop带函数的链表导致无限循环
【发布时间】:2016-02-13 19:41:23
【问题描述】:

我正在尝试制作一个简单的链表,只有一个函数和两个指针。

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

typedef struct leonor{
    int x;
    struct leonor * next;
}leo;

出于练习的目的,我总是在列表的末尾添加我创建的最后一个新节点。函数(add)如下:

void add(leo **ad)
{
    int i;
    leo *current, *new, **previous; /*Previous points on the pointer NEXT
                                     *of an element*/

    new=malloc(sizeof(*new));

    for (i=0;i<3;i++)
    {
        printf("x : ");
        scanf("%d",&new->x);
        new->next=NULL;

        previous = ad; /*'previous' receives adresse of head of list*/
        current = *previous;

        while(current != NULL) /*Look for last element of list*/
        {
            previous = &(current->next);
            current = current->next;
        }

        new->next = *previous;
        *previous = new;
    }
}

其余代码:

void display_(leo *hl)
{
    while (hl)
    {
        printf("%d -> ",hl->x);
        hl=hl->next;
    }
}
int main()
{
    leo * head;
    head = NULL;
    add(&head);
    display_(head);
    return 0;
}

问题是在创建链表(此处为 3 个整数的列表)后,它总是只包含最后输入的数字。并且在显示结果时是相同数字的无限循环。非常感谢帮助。

【问题讨论】:

  • 您需要处理的变量太多。特别是:previous = ad; 您不需要前面的变量,而是可以使用(并分配给)广告。

标签: c linked-list infinite-loop


【解决方案1】:

您只分配一个struct leo 并为您添加的每个元素使用相同的一个。您需要为列表中的每个元素分配一个新元素。

【讨论】:

  • 伙计,我已经好几个小时了,我正在编译和再次编译!抱抱谢谢!
【解决方案2】:

您似乎试图将您的链接条目信息与特定的数据信息/类型结合起来。一般做链接列表的东西。那么实际的询问代码将很容易编写。使用您的链接列表创建列表的代码将很容易。

您的链接列表条目结构应如下所示(按书籍):

typedef struct{
    void* prev;
    void* data;
    void* next;
}link_entry;

构建有关该结构的代码 - 这将使生活变得更加轻松。每次您想要查询数据时都需要进行强制转换,但这会使您的代码变得更加简单。

typedef struct
{
   void* first;
   void* last;
   int n;
} LLst;

一些简单的功能:

LList create()
{
   return(calloc(sizeof(LList));
}

list_entry* add_entry(LList* list, void* data)
{
   list_entry* entry = malloc(sizeof(list_entry);
   entry->prev = list->last;
   entry->data = data;
   entry->next = NULL;
   list->last=entry;
   if(!list->first) list->first=list->last;
   list->n++;
   return entry;
}

void del_entry(LList* list, list_entry* entry)
{
   /* you may wish to add a free data client procedure to free the data as     well */
   list->last=entry->prev;       
   if(entry) free(entry);
   list->n--;
   if(!list->n) list->first=list->last=NULL;
   return entry;
}

【讨论】:

  • 感谢您的努力。
  • 没问题。可能比您需要的更多,但可能对将来的参考有用。感谢您的提问。
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2011-10-01
相关资源
最近更新 更多