我对编程非常陌生。尝试编写一个接收列表头部的函数+要插入的数据 - 并传回列表的新头部。我已经通过在列表的头部添加一个元素来做了很多,但由于某种原因,我无法绕过这个微小的差异。
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct node_{
int data;
struct node_ *next;
} Queue;
int main(void){
Queue* queue = NULL;
queue = enqueue(queue, 1);
assert(queue->next == NULL);
assert(queue->data == 1);
queue = enqueue(queue, 2);
assert(queue->data == 1);
assert(queue->next != NULL);
assert(queue->next->data == 2);
free(queue->next);
free(queue);
return 0;
}
Queue *enqueue(Queue *queue, int data){
Queue *new_node, *p;
new_node = malloc(sizeof(Queue));
new_node->data = data;
new_node->next = NULL;
p = queue;
while(p->next != NULL){
p = p->next;
}
p->next = new_node;
return ??????
}
我知道要插入头部,你可以:
new_node->data = data;
new_node->next = queue;
return new_node;
道歉,如果我上面写的内容没有多大意义。我已经累了,而且我经历了不少次迭代。可能遗漏了一些明显的东西。
答案 0 :(得分:2)
返回queue
。您还必须测试输入queue
是否为NULL,在这种情况下,您显然无法访问next
指针来查找结尾,因此在这种情况下只返回新节点。 / p>
Queue *enqueue(Queue *queue, int data){
Queue *new_node, *p;
new_node = malloc(sizeof(Queue));
new_node->data = data;
new_node->next = NULL;
if (!queue)
return new_node;
p = queue;
while (p->next)
p = p->next;
p->next = new_node;
return queue;
}
答案 1 :(得分:1)
当你发送头部指针时,queue
在这里你不需要返回任何东西。
#include<stdio.h>
#include<stdlib.h>
typedef struct node_{
int data;
struct node_ *next;
} Queue;
Queue * enqueue(Queue *queue, int data){
Queue *new_node, *p;
new_node = malloc(sizeof(Queue));
new_node->data = data;
new_node->next = NULL;
p = queue;
while(p->next != NULL){
p = p->next;
}
p->next = new_node;
p = new_node;
return (queue);
}
void display(Queue *queue)
{
Queue *temp;
for(temp=queue->next;temp!=NULL;temp=temp->next)
printf("%d -> ",temp->data);
printf("null \n");
}
int main(void){
Queue *queue;
queue = malloc(sizeof(Queue));
queue->next = NULL;
queue = enqueue(queue, 1);
queue = enqueue(queue, 2);
queue = enqueue(queue, 3);
queue = enqueue(queue, 4);
display(queue);
}
<强>输出强>
1 -> 2 -> 3 -> 4 -> null
答案 2 :(得分:0)
在enqueue
函数中:
检查参数队列是否为NULL
,第一次是真的,你应该把它作为一个特例来处理:
if (queue == NULL)
{
p = new_node;
p->next = NULL;
return p;
}