C链表的问题

时间:2017-10-22 23:55:49

标签: c linked-list

我有一个函数将struct插入到一个实现为链表的队列中。 我传递一个数组元素作为进程。

void q_insert (queue *q, process p) {
  printf("before insert attemp\n");
  if (q->head == NULL) {
    q->head = malloc(sizeof(struct Node));
    q->head->process = &p;
    q->head->next = NULL;
    q->tail = q->head;
    printf("After insertion into empty\n");
  }
  else {
    struct Node* temp;
    temp = malloc(sizeof(struct Node));
    temp->process = &p;
    temp->next = NULL;
    q->tail->next = temp;
    q->tail = temp;
    printf("after insertion into non empty\n");
  }
}

当我第一次在空列表中调用此函数时,它似乎工作正常。当我尝试插入第二个项目时,它会添加第二个条目,但它也会用第二个条目的副本替换第一个条目。这些是使用的结构:

typedef struct {
  char name[80];
  int arrival_time;
  int execution_time;
  int priority;     // high number is high priority
} process;

struct Node{
  process* process;
  struct Node* next;
} q_node;

typedef struct {
  struct Node* head;
  struct Node* tail;
} queue;

1 个答案:

答案 0 :(得分:0)

C仅支持pass by value,当您通过指针传递address变量时,变量传递的地址副本以及insert函数时q == NULL ,你正在分配内存并将内存分配给q,但这不会改变你职能之外的q:只有q 的副本< / em>您的功能将被更改。

为了更改参数q 指向的内容,并将这些更改反映在函数之外,您需要将指针传递给指针,如下所示:

void q_insert (struct node **q, process p) {
  if (q->head == NULL) {
  struct node* new_head = (struct node*)malloc(sizeof(struct node));
  new_head->head->next = NULL; 
  .
  .
  *q=new_head;
  .
  .
 }