Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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_Linked List - Fatal编程技术网

用C语言链接链表

用C语言链接链表,c,linked-list,C,Linked List,我正在尝试创建(有序)链接列表的(有序)链接列表。列表链接列表由其成员列表的第一个节点携带。我试图通过以下代码实现这一点,但在我尝试将第二个节点插入列表列表后,我的程序立即崩溃 以下是我试图构建的数据结构示意图: 代码: #包括 #包括 #包括 结构节点{ 整数; 结构节点*下一步; 结构节点*lsnext; }; typedef结构节点; 节点*插入值(节点*列表,int值); 无效显示(节点*); 节点*插入器(节点*列表,int值); int main() { 节点*globalList

我正在尝试创建(有序)链接列表的(有序)链接列表。列表链接列表由其成员列表的第一个节点携带。我试图通过以下代码实现这一点,但在我尝试将第二个节点插入列表列表后,我的程序立即崩溃

以下是我试图构建的数据结构示意图:

代码:

#包括
#包括
#包括
结构节点{
整数;
结构节点*下一步;
结构节点*lsnext;
};
typedef结构节点;
节点*插入值(节点*列表,int值);
无效显示(节点*);
节点*插入器(节点*列表,int值);
int main()
{
节点*globalList=NULL,*列表,*开始,*保存;
int nbrOfLists、listNo、NBROFLVAL、valNo、val;
printf(“\n输入列表数:”);
scanf(“%d”和“&nbrOfLists”);
如果(nbrOfLists<0)
返回-1;
for(listNo=0;listNo下一步;
printf(“\n列表%d为:”,列表编号+1);
显示(列表);
}
printf(“\n\n最终列表为:”);
显示(全球列表);
printf(“第一个列表是”);
显示(保存);
printf(“第二个列表为”);
显示(保存->lsnext);//此处崩溃
返回0;
}
节点*插入值(节点*列表,int值)
{
Node*newNode,*m;
newNode=malloc(sizeof(Node));
新建节点->编号=值;
if(list==NULL)
{
newNode->next=NULL;
返回newNode;
}
如果(值<列表->编号)
{
新建节点->下一步=列表;
返回newNode;
}
m=列表;
while(m->next)
{
如果(值next->number)
打破
m=m->next;
}
newNode->next=m->next;
m->next=newNode;
退货清单;
}
无效显示(节点*nodex){
while(nodex)
{
printf(“%d->”,nodex->number);
nodex=nodex->next;
}
}
什么导致了我的错误?

您的
insertar()
函数错误。甚至它的签名都是错误的。它不是将现有列表的第一个节点链接在一起,而是创建一个独立节点的垂直列表。请特别注意,它接受一个值,而需要接受列表的头节点

此外,即使在您调用该函数的情况下也是错误的。您似乎试图链接每个列表的初始头部节点,但头部节点可能会随着您添加值而更改。你必须等到你有一个完整的列表,你才知道它的最终头节点是什么;只有这样,您才能将该列表链接到您的列表中


编辑:我首先断言您的问题是未能初始化节点的
lsnext
成员。如果您的
insertar()
函数实际接受由
insertValue()
创建的节点作为第二个参数(它应该这样做),那么这是正确的,但对于显示的代码来说,这是不正确的。实际问题是我在第一段中描述的问题的结果,
insertar()
创建了一个单独的节点列表。特别是,这些单独的节点没有初始化它们的
next
指针。

很抱歉,但我不知道在什么情况下会出现错误:“就在我尝试将第一个节点插入单独列表的第一个节点的第二个列表之后。”请您将其改写得更清楚一些?当您这样做时,请准确描述您得到的错误。@JohnBollinger我没有被显示为错误,但在运行时,程序正好在我在代码中提到的语句处崩溃。为了更好地解释,我想说,我正在尝试通过在第一个单独列表的第一个节点的lsnext指针的末尾插入来添加第二个单独列表的第一个节点。@JohnBollinger为了更好地理解,我添加了一张图片。您是否尝试过使用调试器逐步执行?你说程序崩溃是什么意思?您是否遇到运行时错误,可能是分段错误?
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct node{
    int number;
    struct node*next;
    struct node*lsnext;
};

typedef struct node Node;
Node* insertValue(Node * list, int value);
void display(Node*);
Node* insertArr(Node * list, int value);

int main()
{

Node *globalList = NULL, *lists,*start,*save;
int nbrOfLists, listNo, nbrOfVal, valNo, val;

printf("\n Enter the number of lists:");
scanf("%d", &nbrOfLists);

if(nbrOfLists < 0)
    return -1;

for(listNo = 0; listNo < nbrOfLists; listNo++)
{
    printf("\n\n Enter the number of inputs to the list %d: \n ",listNo+1);
    scanf("%d", &nbrOfVal);
    lists = NULL;

    for(valNo = 0; valNo < nbrOfVal; valNo++)
    {
        printf("Enter node value %d:", valNo+1);
        scanf("%d", &val);
        // Here we insert the value in both lists
        lists= insertValue(lists, val);

        globalList = insertValue(globalList, val);
    }
      start=lists;
            if(listNo==0){
                save=start;
            }
            start=start->lsnext;

    printf("\n  The list %d is: ",listNo+1);
    display(lists);

}
printf("\n\n The final list is: ");
display(globalList);
printf("The first list is");
display(save);
printf("The second list is");
display(save->lsnext);  // CRASHES HERE 
return 0;
}

  Node* insertValue(Node * list, int value)
  {
  Node *newNode, *m;
  newNode = malloc(sizeof(Node));
  newNode->number=value;

 if(list == NULL)
 {
   newNode->next=NULL;
   return newNode;
 }

 if(value < list->number)
  {
   newNode->next = list;
   return newNode;
  }

 m = list;
 while(m->next)
 {
   if(value < m->next->number)
       break;
   m = m->next;
 }
 newNode->next = m->next;
 m->next = newNode;
 return list;
 }

 void display(Node*nodex){

    while(nodex)
    {
        printf("%d ->",nodex->number);
        nodex=nodex->next;
    }
}