簡體   English   中英

雙鏈表插入分段故障 - C.

[英]Doubly Linked List insertion Segmentation Fault - C

我有一個功課來寫First First First Serve和Round Robin simulaion並比較它們。 我開始創建一個用於制作事件列表的鏈表。 我已經制作了insert和print_list函數,但是無法使它工作。 我的朋友告訴我使用Doubly Linked List,所以我重新處理了鏈表,並嘗試使插入功能正常工作。 我解決了大部分問題,但我現在無法找到插入功能的問題。 我在While循環語句中得到分段錯誤,當我比較插入指針數據和當前指針數據時。 我看過我的C書,它有與我類似的代碼,也通過Doubly Linked List Segmentation Fault -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");
}

您聲明問題最有可能發生在

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

您要測試currentptr!=NULL的事實意味着它可能為NULL。 但如果是,那么你病情的早期部分就會失敗。 首先測試NULL ,然后進行比較的后半部分...:

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

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

在您的代碼中,“eventlist = NULL”傳遞給“add_event”。 這就是分段的原因。

我認為你應該在“add_event”中使用“malloc()”來獲取“eventlist”的條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM