Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印双链表_C_Doubly Linked List - Fatal编程技术网

C 打印双链表

C 打印双链表,c,doubly-linked-list,C,Doubly Linked List,我有一个家庭作业要写“先到先得”和“循环模拟”并比较它们。我开始创建一个链表来制作事件列表。我制作了插入和打印列表函数,但无法使其工作。我的朋友告诉我使用双链表,所以我重新创建了链表,并试图使打印功能正常工作。我有一个关于插入函数的问题,因为我在while循环中的语句顺序有错误。在修复了许多错误后,print函数会多次打印同一个节点,而不是整个列表。我不知道程序的哪一部分是错的。我认为我在insert函数中有错误,我把指针指向了错误的地方,所以我把事件指向了它自己,或者我在print函数中有错误

我有一个家庭作业要写“先到先得”和“循环模拟”并比较它们。我开始创建一个链表来制作事件列表。我制作了插入和打印列表函数,但无法使其工作。我的朋友告诉我使用双链表,所以我重新创建了链表,并试图使打印功能正常工作。我有一个关于插入函数的问题,因为我在while循环中的语句顺序有错误。在修复了许多错误后,print函数会多次打印同一个节点,而不是整个列表。我不知道程序的哪一部分是错的。我认为我在insert函数中有错误,我把指针指向了错误的地方,所以我把事件指向了它自己,或者我在print函数中有错误

当我删除这行代码时,打印功能只打印当前节点,而不打印其他节点

新建指针->下一步=*事件列表

我想这意味着我在这部分有问题,但我不明白为什么

 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;  
}*/
#包括
#包括
结构事件{
结构事件*下一步;
int进程ID;
到达时间;
int cputime;
};
typedef结构事件;
typedef事件*eventPtr;
事件创建_节点(int processid、int arrivaltime、int cputime);
void add_事件(event*newpointer,eventPtr*eventlist);
作废打印节点(事件节点);
作废打印事件列表(事件*事件列表);
事件获取下一个事件(事件*事件列表);
int main(int argc,char*argv[])
{
int sourcenum,a,b,c,i;
事件-事件;
eventPtr eventlist=NULL;
打印事件列表(eventlist);
字符*源,时间片;
如果(argc!=3)
printf(“正确用法是:main.c源时间片\n”);
其他的
{
sourcenum=atoi(argv[1]);
时间片=atoi(argv[2]);
对于(i=0;iarrivaltimearrivaltime))/*在每个循环上,上一个和当前指针都得到升级*/
{
printf(“DONEW\n”);
prevptr=当前Ptr;
currentptr=currentptr->next;
}
printf(“DONEW\n”);
if(prevptr==NULL)//如果将节点放在列表的开头
{
printf(“DONEW\n”);
新建指针->下一步=*事件列表;
*eventlist=newpointer;
}
else//将列表置于当前和上一个列表之间
{
printf(“DONEW\n”);
prevptr->next=newpointer;
newpointer->next=currentptr;
}
printf(“完成”\n);
}
事件创建_节点(int processid、int arrivaltime、int cputime)
{
事件*ptr;
ptr=malloc(sizeof(Event));
如果(ptr!=NULL)
{
ptr->processid=processid;
ptr->到达时间=到达时间;
ptr->cputime=cputime;
ptr->next=NULL;
}
返回*ptr;
}
无效打印节点(事件节点)
{
printf(“进程id=%d\n”,node.processid);
printf(“到达时间=%d\n”,node.arrivaltime);
printf(“CPU时间=%d\n”,node.cputime);
}
void print_eventlist(eventPtr currentpr)/*函数接收事件列表并打印所有事件*/
{
如果(currentPtr==NULL)
{
puts(“列表为空\n”);
}
其他的
{
puts(“列表为:”);
while(currentPtr!=NULL)
{
printf(“===========================================\n”);//列表#%d\n”,i);
打印节点(*currentPtr);
printf(“\n=======================================================\n”);
currentPtr=currentPtr->next;
}
放置(“空\n”);
}
}
/*int i=0;//这是我以前拥有的
事件ptr当前ptr;
*currentptr=*事件列表;
printf(“某物!!!”);
while(currentptr!=NULL)
{
i++;
printf(“====================================================\n列出%d\n”,i);
打印节点(*currentptr);
printf(“\n=======================================================\n”);
currentptr=currentptr->next;
}
}*/
/*事件获取下一个事件(事件*事件列表)
{    
Event newstruct=create_节点(eventlist->processid,eventlist->arrivaltime,eventlist->cputime);
事件列表=事件列表->下一步;
返回newstruct;
}*/
更改以下类型:

 Event tempevent;

您遇到的问题是传递&tempevent和Event tempevent时,此地址始终相同。请更改create_节点以返回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;
}

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

首先,您正在
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)使用指向列表头参数的指针,并根据需要通过取消引用对其进行修改。我更喜欢后者,
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;
}
// 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;
}
#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);
}
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
==========================================