我正在尝试通过在读取节点后将其放置在正确的位置来从文件创建按字母顺序排序的链表。该文件不得按字母顺序排序。该程序可以正确读取文件,并且我可以将所有内容添加到列表的末尾。
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;
考虑到我从这段代码中获得的结果,我认为问题与链接列表的指针或标题有关,或者与这两者有关。有4个位置:P,Z,W,L-我从列表中仅获得P-> Z。
答案 0 :(得分:0)
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版本具有C,请使用strdup
new->place = strdup(string);