我有一个函数将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;
答案 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;
.
.
}