Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中尝试添加到链表开头时出现无限循环_C - Fatal编程技术网

在C中尝试添加到链表开头时出现无限循环

在C中尝试添加到链表开头时出现无限循环,c,C,我正在尝试用C语言练习链表,我创建了一个简单的LL,它带有一个add函数,该函数获取一个位置索引并在该位置插入数据 当我试图使用add_-beg添加到列表的开头时,我不断得到一个无限循环,它只调用位置为0的add_函数(add(0,data))。我似乎找不到发生这种情况的原因。我需要另一双眼睛。代码如下: #包括 #包括 类型定义结构节点{ int_数据; 结构节点\u t*\u下一步; }节点t; node_t*_head=NULL; 无效添加位置(整数位置,整数数据){ node_t*nod

我正在尝试用C语言练习链表,我创建了一个简单的LL,它带有一个add函数,该函数获取一个位置索引并在该位置插入数据

当我试图使用
add_-beg
添加到列表的开头时,我不断得到一个无限循环,它只调用位置为0的
add_
函数(
add(0,data)
)。我似乎找不到发生这种情况的原因。我需要另一双眼睛。代码如下:

#包括
#包括
类型定义结构节点{
int_数据;
结构节点\u t*\u下一步;
}节点t;
node_t*_head=NULL;
无效添加位置(整数位置,整数数据){
node_t*node=malloc(1*sizeof(node_t));
节点->\u数据=数据;
node->_next=NULL;
//如果为空,则插入
如果(_head==NULL){
_头部=节点;
}
否则{
int指数=0;
node_t*prev=NULL;
节点\u t*curr=\u头;
while(curr!=NULL&&index!=pos){
上一次=当前;
curr=curr->\u下一步;
索引++;
}
//插入开头
如果(索引==0){
_头部=节点;
节点->下一步=\u头;
}
//插入端
else if(索引!=0&&curr==NULL){
prev->_next=节点;
}
//插入中间
否则{
prev->_next=节点;
节点->\u next=curr;
}
}
}
void add_beg(整数数据){
在(0,数据)处添加_;
}
void add_end(整数数据){
在(-1,数据)处添加_;
}
无效转储(){
如果(_head!=NULL){
节点\u t*curr=\u头;
while(curr!=NULL){
如果(当前->\u下一步!=NULL){
printf(“%d->”,当前->\u数据);
}
否则{
printf(“%d”,当前数据);
}
curr=curr->\u下一步;
}
printf(“\n”);
}
否则{
printf(“列表为空\n”);
}
}
int main(){
加上(6);;
在(1,1)处添加_;
在(2,3)处添加_;
在(3,9)处添加_;
在(4,8)处添加_;
在(5,5)处添加_;
在(7,2)处添加_;
在(8,4)处添加_;
add_beg(9);//注释掉它可以防止无限循环
dump();
返回0;
}

错误在本节中:

if (index == 0) {
    _head = node;
    node->_next = _head;
}
第二个命令将
node->\u next
设置为
head
。但是,前面的行将
\u头
设置为
节点
。因此,您只需将
node->\u next
设置为
node
,即可创建无限循环

您需要颠倒这两条语句的顺序

if (index == 0) {
        _head = node;
        node->_next = _head;
    }
在这里,您将
\u head
设置为
节点
,但在
下一个节点
之后,在
\u head
执行while循环时,您已经断开了链接列表

修正:


首先将
\u head
设置为
节点->\u next
然后将
\u head
设置为
节点

这是在调试器中遍历执行非常有教育意义的事情之一。