带有函数的链表导致无限循环

时间:2016-02-13 19:41:23

标签: c linked-list infinite-loop

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

#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个整数的列表)后,它始终只包含最后输入的数字。并且当显示结果时是相同所述数字的无限循环。很感激帮助。

2 个答案:

答案 0 :(得分:2)

您只需为您添加的每个元素分配一个class UserByEmailField(forms.ModelChoiceField): def validate(self, value): # Check e-mail is valid # Check user already exists or populate from LDAP def to_python(self, value): # Return CodeUser instance class CodeForm(forms.ModelForm): class Meta: fields = ['custodian'] field_classes = {'custodian' : UserByEmailField} 并使用相同的一个CodeUser。您需要为列表中的每个元素分配一个新元素。

答案 1 :(得分:0)

您似乎尝试将链接条目信息与特定数据信息/类型组合在一起。通常链接列表的东西。然后实际的询问代码将很容易编写。使用链接列表创建列表的代码很简单。

您的链接列表条目结构应如下所示(通过本书):

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;
}