c - 需要帮助来按字母顺序创建我的列表

标签 c

我试图通过在读取文件后将节点放置在正确的位置来从文件创建一个按字母顺序排序的链接列表。文件不得按字母顺序排列。程序正确读取文件,我可以将所有内容添加到列表末尾。

Place search_place(Place first, char *new){

    Place aux = first;

    while (aux->abcnext != NULL){
        if ( strcmp(new,aux->place) > 0)
            aux = aux->abcnext;
        else
            break;
    }
    return aux;
}

void insert_place(Place first, char* string){

    Place previous,temp,new;

    previous = search_place(first, string);

    if (previous->abcnext == NULL){
        new = create_place();
        previous->place = string;
        new->abcnext = previous->abcnext;
        previous->abcnext = new;
    }

    else{
        new = (Place)malloc(sizeof(place_node));
        new->place = string;
        new->abcnext = previous;
        previous = new;
    }
}


Place create_place(){
    Place aux;
    aux=(Place)malloc(sizeof(place_node));

    if (aux!=NULL){
        aux->place=malloc(25*sizeof(char));
        aux->abcnext=NULL;
    }
    return aux;
}


typedef struct placenode*Place;

typedef struct placenode{
    char *place;
    Place abcnext;
}place_node;

考虑到我从这段代码中获得的结果,我认为问题与指针或链接列表的 header 或两者都有关。有 4 个位置:P、Z、W、L - 我从列表中仅得到 P -> Z。

最佳答案

if (previous->abcnext == NULL){
    new = create_place();
    previous->place = string;
    new->abcnext = previous->abcnext;
    previous->abcnext = new;
}

上面的代码有几个明显的问题。首先,您没有设置 new->place - 您替换了 previous->place ,这似乎不正确。因此,您的新节点的“位置”将为 NULL,并且您将丢失前一个节点的值。

其次,您要分配string 的值,而不是创建一个新副本。如果每次调用该函数时都使用相同的字符串,那么最终所有节点都会指向同一个字符串。

你应该做类似的事情

    new->place = malloc(strlen(string)+1);
    strcpy(new->place, string);

或者如果您的 C 版本有它,请使用 strdup

    new->place = strdup(string);

关于c - 需要帮助来按字母顺序创建我的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56172751/

相关文章:

c - 删除c中链表中最后一项的问题

c - 为什么 printf() 对于大整数输出 -1?

c - C 中的 PIC 编程 : if any in list is true then

c - 将 16 位变量存储到取消引用的变量写入 32 位

c++ - NEON 与英特尔 SSE - 某些操作的等效性

c - 关于pthread_join函数的问题

c - 是否可以在运行时将 Cert.der 和 key.der 写入内部闪存 EEprom 中?我用的是stm32

c++ - 在不使用单个 if 的情况下执行某些语句

c++ - C 结构继承与 C++ POD 结构继承

c - GTK C - 使用 g_signal_connect 传递多个变量