我已编写此代码以按位置插入链接列表。
void insert(node *list, int data, int position) {
int c;
node *temp;
node *prev;
node *curr;
curr = list;
temp = malloc(sizeof(node));
temp->num = data;
if (curr == NULL) {
curr = temp;
curr->next = NULL;
} else {
while (curr != NULL && c != position) {
prev = curr;
curr = curr->next;
c++;
}
if (c = 0) {
temp->next = curr;
curr = temp;
} else if (curr == NULL) {
prev->next = temp;
} else {
prev->next = temp;
temp->next = curr;
}
}
}
但是,我相信无论什么都会执行此块,并且数据会附加到链表的末尾。
else if (curr == NULL) {
prev->next = temp;
为什么curr
始终为空?如果位置小于列表中的元素数量,则不应该为空...
答案 0 :(得分:1)
您尚未在开头将c变量初始化为0。还有条件 if(c = 0)应该是 if(c == 0)
temp-> next = NULL也应该在temp-> num = data之后完成,否则在
的情况下它将保持未初始化状态 else if (curr==NULL) {
prev->next=temp;
}
这些是我注意到的。
答案 1 :(得分:1)
您的代码中存在多个问题:
未初始化局部变量c
。在没有事先初始化的情况下使用它会调用未定义你应该这样定义:
int c = 0;
测试if (c = 0)
将c
的值设置为0
并始终失败。请改用==
运算符:
if (c == 0) {
...
您必须返回list
并将list
设置为curr
是否已在列表开头插入元素(位置0)或列表为空。< / p>
以下是改进版本:
node *insert(node *list, int data, int position) {
node *temp = malloc(sizeof(node));
if (temp == NULL) {
return NULL;
}
temp->num = data;
if (list == NULL || position <= 0) {
temp->next = list;
return temp;
} else {
node *curr = list;
while (position-- > 0 && curr->next != NULL) {
curr = curr->next;
}
temp->next = curr->next;
curr->next = curr;
return list;
}
}
答案 2 :(得分:1)
你在那里有一个局部变量:c
。
该变量具有自动存储功能,其起始值不确定。 你必须初始化。
int c = 0;
否则它的初始值可以是函数被调用时寄存器旧值或内存垃圾,所以
while (curr!=NULL && c != position)
行为未定义。
此外,if之后的if检查有问题:相等的关系运算符是==
if (c=0)
必须是
if (c==0)
否则,您要将0
分配给c
,而不是测试其值。