【问题标题】:Linked List printing only last element in C链表仅打印 C 中的最后一个元素
【发布时间】:2017-01-27 16:35:53
【问题描述】:

我想在链表上实现快速排序,但我在从文本文件读取到链表和打印所有节点时遇到问题。我只将最后一个元素打印为输出。我做错了什么?

我的文本文件如下所示(密码及其使用频率):

asdfgh 31554
snoopy1 15637
qwertyuiop 24372
soccer 21208
.
.

这是我的结构

struct list_element {
char *password;
int count;
list_element* next;
};

struct list {
list_element* first;
list_element* last;
};

ReadfromData()

void read_data(char* filename, list* mylist)
{

FILE *fp;

char password[128];
int freq;

fp = fopen(filename, "r");

if(fp == NULL)
{
 perror("Error opening file");
 return;
}


while(fgets(password, sizeof(password), fp))
{

 list_element *node = malloc(sizeof(list_element));

 char *token;
 token = strtok(password, " ");
 node->password = strdup(token);

 if( token != NULL ){
 token = strtok(NULL, " ");
 }

 freq = atoi(token);
 node->count = freq;
 node->next = NULL;

 insert_list(node, mylist);
 }

 fclose(fp);
}

在列表中插入infront

void insert_list(list_element* le, list* mylist)

if((mylist->first = NULL)){
mylist->first = le;
}else{
le->next = mylist->first;
mylist->first = le;
} 

打印列表

void print_list(list* mylist)

list_element *temp;
temp = mylist->first;

while(temp != NULL)
{
printf("pass %s and count %d \n", temp->password, temp->count);
temp = temp->next;
}

我还写了一个小函数,我在程序的开头调用它来详细化列表:

void init_list(list* mylist){
mylist = (list*)malloc(sizeof(list));
mylist->first = mylist->last = NULL;
}

但我认为在这里做 malloc 也没有意义,因为我已经一个一个地创建了节点,对吧?有点困惑。

任何建议都会很棒!

【问题讨论】:

  • 欢迎来到 Stack Overflow!听起来您可能需要学习如何使用debugger 来单步执行您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs.
  • 注意:node->password = strdup(token); if( token != NULL ){ 不清楚。如果token == NULLstrdup(NULL)problem

标签: c linked-list


【解决方案1】:

让我们仔细看看init_list 函数:

void init_list(list* mylist){
mylist = (list*)malloc(sizeof(list));
mylist->first = mylist->last = NULL;
}

参数mylist 是一个本地 变量。因此,当函数结束时,它将超出范围,对它的所有更改都将丢失。因此,您在调用 init_list 之后将使用的指针实际上不会被初始化,并且当您使用它时会出现未定义的行为

有两种解决方案:要么让init_list 不带参数,而是返回 新列表。或者您通过从调用函数传递指向列表变量的指针来模拟 按值传递,这意味着 init_list 函数接受指向结构指针的指针。

第二种选择可能如下所示

void init_list(list **mylist)
{
    *mylist = malloc(sizeof **mylist);
    (*mylist)->first = (*mylist)->last = NULL;
}

然后你使用地址操作符来调用它:

list *mylist;
init_list(&mylist);

【讨论】:

  • 感谢您的回复。我明白了。
猜你喜欢
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多