【问题标题】:How can i create multiple linked lists in C for same types of data?如何在 C 中为相同类型的数据创建多个链表?
【发布时间】:2021-12-31 04:36:54
【问题描述】:
struct clist {
    int pos;
    char* color;
    struct clist *next;
};
typedef struct clist sl_clist;
sl_clist *head = NULL;

sl_clist* link[5];

所以我试图创建多个单链循环列表并将它们放入堆栈中,每个列表都将具有相同类型的数据。在这种情况下,我将堆栈用作数组。但我就是不知道如何从单一类型创建多个链表。我是一名学生,所以我对 C 不是很有经验。谢谢提前帮助。

void create_list (int N, sl_clist* head){
    int i;
    sl_clist *new;
    sl_clist *old;
    if(N == 0){
        head = NULL;
    }
    srand(time(0));
    for(i = 0; i < N; i++){
        new = (sl_clist*)malloc(sizeof(sl_clist));
        if(i == 0){
            head = new;
            new -> color = color[(rand()%10)];
            new -> pos = pos[i];    
            new -> next = head;
        }
        else{
            new -> color = color[(rand()%10)];
            new -> pos = pos[i];    
            old -> next = new;
            new -> next = head;
        }
        old = new;
    }
}

我也尝试过创建多个“头”变量,但由于某种原因,当我在这个函数中使用它们时(想象一下有颜色和位置的数组),它们总是返回 NULL。

【问题讨论】:

  • 问:如何创建多个链表...并将它们放入堆栈?一个简单的。 sl_clist* link[] 中的每个元素都不是单个变量sl_clist *head,而是不同列表的头部。另外:您可能希望将struct clist {}typedef struct clist sl_clist 组合到同一个声明中。向下滚动这些示例以查看如何操作:educative.io/edpresso/how-to-use-the-typedef-struct-in-c
  • @paulsm4 好的,所以我实际上已经尝试为多个头创建多个变量,但这次我在我在这里的函数中使用它们时遇到了麻烦。出于某种原因,当我简单地使用变量的名称而不是将其用作参数时,它可以工作。但是当我将它用作参数时,它保持为 NULL,不会创建列表。也许我没有使用正确的参数类型?
  • 您似乎对解决方案没有抽象概念。在编写代码之前,您需要考虑算法和数据结构。代码只是最后一步。如果您对抽象部分很清楚,那么参数类型之类的东西就会自然而然地出现。所以这是我的建议:从代码中退后一步,拿起铅笔和几张纸,在更高的层次上解决任务。
  • Singly Linked List of Integers (example) - 您可以创建任意数量的list_t 类型列表。
  • 这是个问题:void create_list (int N, sl_clist* head){}。问题:*head 仅在函数内部更新。调用者永远看不到变化。解决方案:void create_list (int N, sl_clist **head){}。这篇文章可能有助于解释:eskimo.com/~scs/cclass/int/sx8.html

标签: c


【解决方案1】:

不要使用全局变量。删除它们。

sl_clist *head = NULL;
sl_clist* link[5];

使用本地变量将“强制”您使用支持多个列表的模块化设计。

变量按值传递:

    head = new;

修改作为参数传递的原始指针的副本 sl_clist* head。原指针不受影响

有多种方法可以解决这个问题。您可以返回新值:

 sl_clist *create_list (int N, sl_clist* head){
       ...
       return new; // or old value
 }
int main() {
   sl_clist *head = NULL;
   head = create_list(5, head);
}

你可以通过引用来获取指针:

int create_list (int N, sl_clist **head){
      ...
      *head = new; // set new value
      (*head)->something = something; // be aware of operator precedence
}
int main() {
   sl_clist *head = NULL;
   create_list(5, &head);    // head is getting modified
}

但我建议为头部做一个单独的类型。这样功能就很清楚了——它需要head,具体来说,不是任何列表元素。详细一点:

struct sl_head {
    struct clist *head;
};
int create_list(int N, struct sl_head *head) {
    //                       ^^^^^^^^^^^^ - verbose, this is the head, not some element, less mistakces
    head->head = new;   // a bit more to type
    head->head->something = something; 
}

int main() {
    struct sl_head head = {0};  // no longer a pointer
    create_list(5, &head);      // head is getting modified
}

srand(time(0)); 移动到main()。它不是您在创建列表时调用的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多