2014-02-13 155 views
1

我有作家写先到先服务和循环赛模拟并比较它们。我开始创建一个链接列表来制作一个事件列表。我做了插入和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; 
}*/ 
+1

而不是在'create_node'中返回一个本地堆栈对象,应该返回一个动态的(堆分配的)内存,可以从程序的其余部分预测地操作它。即返回'PTR'不''PTR' .. – amdixon

+0

我改变了它,它的工作,但我不明白为什么?你可以请给我一本书或一页阅读内存分配。我看到我没有完全理解它。 – Vato

+2

Side Bar:当我说'eventPtr'给这段代码添加* nothing *时,你只需要相信我。你应该使用'Event *'。这将使得任何精通C的人都更容易阅读。 – WhozCraig

回答

1

变化的类型:

Event tempevent; 

eventPtr tempevent; 

你的问题是,你通过& tempevent与事件tempevent,该地址总是一样的。更改create_node以返回一个eventPtr。

eventPtr 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; 
} 
2

在这段代码中有很多东西需要解决。

首先,您在create_node中泄漏内存。这个功能应该专为动态分配的情况下,与传递的参数做准备,并返回给调用者的地址被分配给一个指针在呼叫侧:

Event* create_node(int processid, int arrivaltime, int cputime) 
{ 
    Event *ptr = malloc(sizeof(*ptr)); 
    if (ptr == NULL) 
    { 
     perror("Failed to allocate Event."); 
     exit(EXIT_FAILURE); 
    } 

    ptr->processid = processid; 
    ptr->arrivaltime = arrivaltime; 
    ptr->cputime = cputime; 
    ptr->next = NULL; 
    return ptr; 
} 

接下来,您add_event函数应该将一个事件指针作为列表头,理想情况下是所述指针的地址,以便在初始插入时对其进行修改。插入函数有两种思想流派,(1)总是返回列表头,(2)使用列表头参数的指针指针,并根据需要通过解引用对其进行修改。我更喜欢后者,因为它使得代码很简单,就是。在你的情况下更是如此,因为在其他地方完成新的事件创建。

// link an event on to the end of our linked list. 
void add_event(Event** pp, Event* event) 
{ 
    while (*pp) 
     pp = &(*pp)->next; 
    *pp = event; 
} 

一旦这些都被认真考虑,在main()源也变得显著简单,考虑到我还固定不当timeSlice变量,这是char,应该已经int。更重要的是,你所拥有的逻辑将会有一个空白的列表头节点,它不会为你带来任何收益。您可以使用指针,然后调用我们的add_event函数并传递其地址。它会正确插入节点。

最终产物看起来像这样(轻微MODS):

#include <stdio.h> 
#include <stdlib.h> 

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

Event* create_node(int processid, int arrivaltime, int cputime); 
void add_event(Event** head, Event *event); 
void print_node(const Event* node); 
void print_eventlist(const Event *eventlist); 

int main(int argc, char* argv[]) 
{ 
    int sourcenum,a,b,c,i,timeslice; 
    Event* events = NULL; 

    if(argc != 3) 
    { 
     printf("Proper usage is: main.c sources time-slice\n"); 
     exit(EXIT_FAILURE); 
    } 

    // TODO: these really should be using strtol() for better 
    // error detection. left as exercise for author. 
    sourcenum = atoi(argv[1]); 
    timeslice = atoi(argv[2]); 

    for(i = 0; i < sourcenum ; i++) 
    { 
     printf("please enter the process-id, arrival-time and cpu-time.\n"); 
     if (scanf("%d %d %d",&a, &b, &c) == 3) 
     { 
      add_event(&events, create_node(a,b,c)); 
      print_eventlist(events); 
     } 
    } 
    return 0; 
} 

// link an event on to the end of a linked list. 
void add_event(Event** pp, Event* event) 
{ 
    while (*pp) 
     pp = &(*pp)->next; 
    *pp = event; 
} 

Event* create_node(int processid, int arrivaltime, int cputime) 
{ 
    Event *ptr = malloc(sizeof(*ptr)); 
    if (ptr == NULL) 
    { 
     perror("Failed to allocate Event."); 
     exit(EXIT_FAILURE); 
    } 

    ptr->processid = processid; 
    ptr->arrivaltime = arrivaltime; 
    ptr->cputime = cputime; 
    ptr->next = NULL; 
    return ptr; 
} 

void print_node(const Event* node) 
{ 
    if (node != NULL) 
    { 
     printf("process-id = %d\n",node->processid); 
     printf("Arrival Time = %d\n",node->arrivaltime); 
     printf("CPU time = %d\n",node->cputime); 
    } 
    else 
    { 
     printf("NULL\n"); 
    } 
} 

void print_eventlist(const Event* currentPtr) 
{ 
    puts("=========================================="); 
    while(currentPtr != NULL) 
    { 
     print_node(currentPtr); 
     puts("=========================================="); 
     currentPtr = currentPtr->next; 
    } 
    puts("NULL"); 
    puts("==========================================");//list #%d\n",i); 
} 

样本输出

从命令行请求5项获得。

please enter the process-id, arrival-time and cpu-time. 
1 1 1 
========================================== 
process-id = 1 
Arrival Time = 1 
CPU time = 1 
========================================== 
NULL 
========================================== 
please enter the process-id, arrival-time and cpu-time. 
2 2 2 
========================================== 
process-id = 1 
Arrival Time = 1 
CPU time = 1 
========================================== 
process-id = 2 
Arrival Time = 2 
CPU time = 2 
========================================== 
NULL 
========================================== 
please enter the process-id, arrival-time and cpu-time. 
3 3 3 
========================================== 
process-id = 1 
Arrival Time = 1 
CPU time = 1 
========================================== 
process-id = 2 
Arrival Time = 2 
CPU time = 2 
========================================== 
process-id = 3 
Arrival Time = 3 
CPU time = 3 
========================================== 
NULL 
========================================== 
please enter the process-id, arrival-time and cpu-time. 
4 4 4 
========================================== 
process-id = 1 
Arrival Time = 1 
CPU time = 1 
========================================== 
process-id = 2 
Arrival Time = 2 
CPU time = 2 
========================================== 
process-id = 3 
Arrival Time = 3 
CPU time = 3 
========================================== 
process-id = 4 
Arrival Time = 4 
CPU time = 4 
========================================== 
NULL 
========================================== 
please enter the process-id, arrival-time and cpu-time. 
5 5 5 
========================================== 
process-id = 1 
Arrival Time = 1 
CPU time = 1 
========================================== 
process-id = 2 
Arrival Time = 2 
CPU time = 2 
========================================== 
process-id = 3 
Arrival Time = 3 
CPU time = 3 
========================================== 
process-id = 4 
Arrival Time = 4 
CPU time = 4 
========================================== 
process-id = 5 
Arrival Time = 5 
CPU time = 5 
========================================== 
NULL 
========================================== 

无论如何,希望它给你一些好点子。