gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:45:42 25 4
gpt4 key购买 nike

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

最佳答案

您声明问题最有可能出现在

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

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

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

关于c - 双向链表插入段错误 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21745444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com