我想在函数中提供一些帮助。
我想编写一个插入链表的函数。但不仅仅是在中间,如果必须插入到前端或末端,它必须工作。
结构:
typedef struct ranklist {
int point;
char* name;
struct ranklist *next;
} ranklist;
A开始使用它,但它不起作用,程序每次都停止。
功能:
void rank_insert(ranklist *b, ranklist *first){
ranklist *nw;
int name_length;
nw = (ranklist*) malloc(sizeof(*b));
nw->point = b->point;
name_length = strlen(b->name);
nw->name = (char*) malloc(name_length + 1);
nw->name = b->name;
int element = 0;
while(first != NULL){
if (first->point > uj->point){
if (first->next == NULL){
nw->next = NULL;
first->next = nw;
}
first = first->next;
element++;
}
else if (first->point == uj->point){
nw->next = first->next;
first->next = nw;
}
else if (first->point < nw->point){
if (element == 0){
nw->next = first;
first = nw;
}
else{
nw->next = first->next;
first->next = nw;
}
}
}
}
我有一个从文件读取的工作,写入文件,printf和自由函数
答案 0 :(得分:1)
这看起来不对:
nw->name = (char*) malloc(name_length + 1);
nw->name = b->name;
nw-&gt; name是一个指针。 C不会将对象分配给指针,它会使用b-&gt; name by value覆盖nw-&gt; name。尝试
nw->name = (char*) malloc(name_length + 1);
strcpy(nw->name, b->name, name_length);
nw->name[name_length] = '\0';
另外,我看到uj
已使用,但它在哪里定义?
需要返回first
,因为该函数可以更改列表的头部。
我不认为这个循环处理插入空列表。
代码是按降序维护列表,除了first->point < uj->point
和element != 0
时,它首先放置uj。
处理单个链接列表中的插入的方法是跟踪指向每个元素的指针,以便能够在之前或之后进行处理。所以声明ranklist **pptr = &first
并检查(* pptr) - &gt;点。如果它更小,*pptr = uj
其他pptr = &(*pptr)->next;
一种有趣的阅读代码,只有双语匈牙利语/英语程序员才能理解: - )