【发布时间】:2021-03-27 08:54:40
【问题描述】:
我写了一个函数,将一个链表一分为二,其中传递的链表保存正个数字并返回负个数字列表。
struct elem {
int val;
struct elem *next;
};
struct elem *create(int val) {
struct elem *temp;
temp=(struct elem*) malloc(sizeof(struct elem));
temp->val = val;
temp->next = NULL;
return temp;
}
void addToEnd(struct elem* list, int nval) {
struct elem *temp = list;
struct elem *new_list = create(nval);
if(temp == NULL) {
list = new_list;
return;
}
while(temp->next != NULL) {
temp = temp->next;
}
temp->next = new_list;
}
struct elem* split(struct elem** list) {
struct elem* prev;
struct elem* temp = *list;
struct elem* positive = (struct elem*) malloc(sizeof(struct elem));
struct elem* negative = (struct elem*) malloc(sizeof(struct elem));
while(temp != NULL) {
if(temp->val > 0) addToEnd(positive, temp->val);
else if(temp->val < 0) addToEnd(negative, temp->val);
prev = temp;
temp = temp->next;
free(prev);
}
*list = positive;
return negative;
}
使用此函数后,我的两个列表都包含 0 作为第一个值,无论传递的列表在使用函数之前包含什么值。 如何解决这个问题?
【问题讨论】:
-
Kindle 粘贴整个代码
-
因为 addToEnd 正是这样做的,所以将值添加到末尾。由于这是你在拆分中做的第一件事,它只会将元素添加到正数,而不对第一个元素做任何事情。
-
如果列表为空,
addToEnd不起作用。它设置list = new_list,但list是addToEnd的本地。要么将第一个参数声明为struct elem **list,要么返回更新后的list。 -
我认为应该可以。
-
@IanAbbott 谢谢,我决定 addToEnd 函数来创建新列表以防列表为空,但完全忘记了我写的只是在本地工作。修复了它,它可以按我的意愿工作。
标签: c split linked-list singly-linked-list function-definition