当前位置: 首页 > 知识库问答 >
问题:

双链表插入分段错误-C

关苗宣
2023-03-14

我有一个家庭作业要写“先到先得”和“循环模拟”并比较它们。我开始创建一个链表来制作事件列表。我制作了插入和打印列表函数,但无法使其工作。我的朋友告诉我使用双链表,所以我重新创建了链表,并试图使插入函数工作。我修复了大部分问题,但现在找不到插入函数的错误。当我比较是否插入指针数据和当前指针数据时,While循环语句出现分段错误。我已经阅读了我的C语言书,书中的代码与我的代码相似,并且还通过了双链表分段错误-C问题,但仍然无法得到我的错误。

这是我的输出

-bash-3.2$ ./main 3 100
please enter the process-id, arrival-time and cpu-time.
1 2 3 4
something
something
DONE1
DONE2
DONE3
DONE4
Segmentation fault

由于test4(DONE4)已打印,而下一个测试未打印,这意味着我在这部分中有一个错误

while((currentptr->arrivaltime < newpointer->arrivaltime) && currentptr != NULL)

你能帮帮我吗?我的代码有什么问题?

struct event {
   struct event *next;
   int processid;
   int arrivaltime;
   int cputime;
};
typedef struct event Event;
typedef Event *eventPtr;

Event create_node(int processid, int arrivaltime, int cputime);
void add_event(Event *newpointer, eventPtr *eventlist);
void print_node(Event node);
void print_eventlist(Event *eventlist);
Event get_nextevent(Event *eventlist);

int main(int argc, char* argv[])
{
int sourcenum,a,b,c,i;
Event tempevent;
eventPtr eventlist = NULL;
print_eventlist(&(*eventlist));
char* sources,timeSlice;
if(argc != 3)
printf("Proper usage is: main.c sources time-slice\n");
else
{
    sourcenum = atoi(argv[1]);
    timeSlice = atoi(argv[2]);
    for(i = 0; i < sourcenum ; i++)
    {
          //print_eventlist(&(*eventlist));
          printf("please enter the process-id, arrival-time and cpu-time.\n");
          scanf("%d %d %d",&a, &b, &c);
          printf("something\n");
          tempevent = create_node(a,b,c);
          print
          printf("something\n");
          add_event(&tempevent, &eventlist);
    }

}
return 0;
}


void add_event(Event *newpointer, eventPtr *eventlist)     //insert
{
 printf("DONE1\n");
 eventPtr currentptr, prevptr;
 printf("DONE2\n");
 prevptr = NULL;
 printf("DONE3\n");
 currentptr = *eventlist;
 printf("DONE4\n");
 while((currentptr->arrivaltime < newpointer->arrivaltime) && currentptr != NULL)                  /*on every loop previous and current pointer gets upgraded*/
 {
         printf("DONEW\n");
         prevptr = currentptr;
         currentptr = currentptr->next;   
 }
 printf("DONEW\n");
 if(prevptr != NULL)
 {
     printf("DONEW\n");
     prevptr->next = newpointer;
     newpointer->next = currentptr;
 }
 else
 {
     printf("DONEW\n");
     newpointer->next = *eventlist;                      //?????
     *eventlist = newpointer;
 }
 printf("DONE\n");
}

共有2个答案

莘欣怿
2023-03-14
eventPtr eventlist = NULL;

add_event(&tempevent, &eventlist);
{
    currentptr = *eventlist;  //currentptr == NULL at this point
    ...............
    while(currentptr->arrivaltime ....)  // Segmentation
}

代码中,“eventlist=NULL”传递到“add_event”。这就是分割的原因。

我认为在“添加事件”中使用“事件列表”之前,应该先执行“malloc()”以获取“事件列表”的条目。

王君墨
2023-03-14

你说问题很可能是在

while((currentptr->arrivaltime < newpointer->arrivaltime) && currentptr != NULL)

您想要测试currentptr=NULL表示它可能为NULL。但是如果是这样的话,你的早期症状就会消失。首先测试NULL,然后进行第二部分比较…:

while(currentptr != NULL && (currentptr->arrivaltime < newpointer->arrivaltime))
 类似资料:
  • 我正在实现一个类似于队列的双链接列表。因此,当我向列表中添加节点(例如5个节点)并清空列表并尝试向列表中添加新节点时,会出现分段错误(核心转储)。我不知道它为什么这么做。你能解释一下吗?

  • 我试图在C中的双向链表上做插入排序。在这种状态下,我的代码让我陷入了一个没有结束的循环,吐出了8和9。 有人能好心解释一下“插入排序”方法是如何设计的吗? 我的链表是设计包含头,上一个,下一个和一些数据。 到目前为止这是我的代码 我的希望破灭了。请帮忙。

  • 我第一次使用链表,必须创建一个可以在双链表末尾插入节点的函数。到目前为止我 Node类按顺序接受要存储的值、要指向的下一个指针的值和上一个指针的值。每当我试图在这里插入节点时,我都会得到一个错误,说有一个未处理的异常,并且在写入位置0x00000008时有访问冲突。 我不完全确定这里出了什么问题,但我认为这与根据错误消息取消引用空指针有关。我真的很感激有人帮忙解决这个问题。

  • 我正在尝试为一个项目创建一个双链接列表容器。我不能使用任何std容器。必须对双链接列表进行排序。以下是我目前的代码: 我遇到的问题是在我的插入函数中。我正在使用调试器,并在以下行插入代码:list.insert(10);。 它正确地进入第一种情况,即head==nullptr并创建节点。当我进入下一行代码(list.insert(20))时,它会用这一行创建一个节点:node*node=newno

  • 我的程序不断崩溃。我觉得我的逻辑有问题。请帮忙!谢谢

  • 分段故障发生在“电流->prev->next=temp”上。我试图打印地址以了解为什么会发生这种情况,并发现在输入中第一个节点的前一个元素总是指向NULL。有人能解释为什么会发生这种情况以及如何修复它吗?谢谢你。