我有作家寫先到先服務和循環賽模擬並比較它們。我開始創建一個鏈接列表來製作一個事件列表。我做了插入和print_list函數,但無法使其工作。我的朋友告訴我使用雙鏈表,所以我重新啓動鏈表,並試圖使打印功能正常工作。我有一個關於插入函數的問題,因爲我在while循環中的語句順序有誤。修復了很多錯誤後,打印功能多次打印相同的節點,而不是整個列表。我不能確定程序的哪一部分是錯誤的。我認爲我在插入函數和I點指針都有錯誤,所以我得到事件指向自己或者我在打印函數中有錯誤。打印雙向鏈接列表
當我刪除這行代碼的打印功能只打印當前節點,沒有別的。
newpointer-> next = * eventlist;
我認爲這意味着我在這部分有問題,但我不明白爲什麼。
if(prevptr == NULL) //if putting node at the beginning of the list
{
printf("DONEW\n");
newpointer->next = *eventlist;
*eventlist = newpointer;
}
能否請你告訴我,什麼是錯的代碼?
#include <stdio.h>
#include <stdlib.h>
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);
printf("something\n");
add_event(&tempevent, &eventlist);
print_eventlist(eventlist);
}
print_eventlist(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 != NULL && currentptr->arrivaltime < newpointer->arrivaltime)) /*on every loop previous and current pointer gets upgraded*/
{
printf("DONEW\n");
prevptr = currentptr;
currentptr = currentptr->next;
}
printf("DONEW\n");
if(prevptr == NULL) //if putting node at the beginning of the list
{
printf("DONEW\n");
newpointer->next = *eventlist;
*eventlist = newpointer;
}
else //putting list between current and previous
{
printf("DONEW\n");
prevptr->next = newpointer;
newpointer->next = currentptr;
}
printf("DONE\n");
}
Event create_node(int processid, int arrivaltime, int cputime)
{
Event *ptr;
ptr = malloc(sizeof(Event));
if(ptr != NULL)
{
ptr->processid = processid;
ptr->arrivaltime = arrivaltime;
ptr->cputime = cputime;
ptr->next = NULL;
}
return *ptr;
}
void print_node(Event node)
{
printf("process-id = %d\n",node.processid);
printf("Arrival Time = %d\n",node.arrivaltime);
printf("CPU time = %d\n",node.cputime);
}
void print_eventlist(eventPtr currentPtr) /*function receives an eventlist and prints all of the events*/
{
if(currentPtr == NULL)
{
puts("List is empty\n");
}
else
{
puts("The List is:");
while(currentPtr != NULL)
{
printf("==========================================\n");//list #%d\n",i);
print_node(*currentPtr);
printf("\n==========================================\n");
currentPtr = currentPtr->next;
}
puts("NULL\n");
}
}
/*int i=0; //This is what I had before
eventPtr currentptr;
*currentptr = *eventlist;
printf("something!!!");
while(currentptr != NULL)
{
i++;
printf("==========================================\nlist #%d\n",i);
print_node(*currentptr);
printf("\n==========================================\n");
currentptr = currentptr->next;
}
}*/
/*Event get_nextevent(Event *eventlist)
{
Event newstruct = create_node(eventlist->processid, eventlist->arrivaltime, eventlist->cputime);
eventlist = eventlist->next;
return newstruct;
}*/
而不是在'create_node'中返回一個本地堆棧對象,應該返回一個動態的(堆分配的)內存,可以從程序的其餘部分預測地操作它。即返回'PTR'不''PTR' .. – amdixon
我改變了它,它的工作,但我不明白爲什麼?你可以請給我一本書或一頁閱讀內存分配。我看到我沒有完全理解它。 – Vato
Side Bar:當我說'eventPtr'給這段代碼添加* nothing *時,你只需要相信我。你應該使用'Event *'。這將使得任何精通C的人都更容易閱讀。 – WhozCraig