双向链表插入分段错误 - C

Posted

技术标签:

【中文标题】双向链表插入分段错误 - C【英文标题】:Doubly Linked List insertion Segmentation Fault - C 【发布时间】:2014-03-11 19:29:32 【问题描述】:

我有一个作业要编写先到先服务和循环模拟并比较它们。我开始创建一个用于制作事件列表的链接列表。我已经制作了 insert 和 print_list 函数,但无法使其工作。我的朋友告诉我使用双向链表,所以我重新创建了链表并试图使插入功能起作用。我修复了大部分问题,但我现在找不到我的插入功能有什么问题。当我比较是否插入指针数据和当前指针数据时,我的 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");

【问题讨论】:

【参考方案1】:

你说问题最有可能发生在

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

您要测试currentptr!=NULL 的事实意味着它可能为NULL。但如果是这样,那么你的状况的早期部分就会失败。首先测试NULL,然后进行后半部分的比较...:

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

【讨论】:

成功了,非常感谢。我应该记下这个问题还是离开它?我在 *** 方面没有真正的经验,我不知道这个问题是否应该留在页面上。 不客气。这不是一个“坏”的问题——我认为你没有理由把它拿下来。我们对这类事情进行了社区审核——当人们认为某个问题不属于他们时,他们会投票(对你来说是不可见的)。不用担心。要开心。多多学习。然后通过回答其他人的问题(如果您解决了一个特别棘手的问题,也可以回答您自己的问题)开始分享您的经验。【参考方案2】:
eventPtr eventlist = NULL;

add_event(&tempevent, &eventlist);

    currentptr = *eventlist;  //currentptr == NULL at this point
    ...............
    while(currentptr->arrivaltime ....)  // Segmentation

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

我认为您应该先执行“malloc()”来获取“eventlist”的条目,然后再在“add_event”中使用它。

【讨论】:

以上是关于双向链表插入分段错误 - C的主要内容,如果未能解决你的问题,请参考以下文章

c语言 双向链表的简单操作-创建插入删除

如何使用C将值插入双向链表

数据结构C语言版 —— 链表增删改查实现(单链表+循环双向链表)

双向链表

双向循环链表增删查改C语言实现

数据结构之带头结点的循环双向链表详细图片+文字讲解