我用C语言学习编程,我遇到了一些麻烦,特别是在使用指针时。这对我来说有点困难,因为我们不会在Java或C#中使用指针。
我尝试做的是创建链接列表(在互联网上找到的代码)并推送其中的元素。如下面的代码所示。
当我取消注释第二行代码时,代码可以工作,但我收到以下列表作为答案{0,1,2},即使我没有在列表中推送数字0 。我希望得到这个答案:{1,2}。
int main (){
node_t * test_list = NULL;
//test_list = malloc(sizeof(node_t));
push(test_list, 1);
push(test_list, 2);
print_list(test_list);
return 0;
}
这就是代码的样子:
typedef struct node
{
int val;
struct node * next;
} node_t;
void print_list(node_t * head)
{
node_t * current = head;
while (current != NULL)
{
printf("%d\n", current->val);
current = current->next;
}
}
node_t* new_node(node_t * head)
{
node_t * head2 = malloc(sizeof(node_t));
return head2;
}
void push(node_t * head, int val)
{
if (head == NULL)
{
head = new_node(head);
head->val = val;
head->next = NULL;
}
else
{
node_t * current = head;
while (current->next != NULL)
current = current->next;
/* now we can add a new variable */
current->next = malloc(sizeof(node_t));
current->next->val = val;
current->next->next = NULL;
}
}
在push函数中,我决定检查head是否等于NULL。如果是这种情况,我只想创建一个新节点并将其分配给它。我不知道这是不是一个好方法。然而,它没有用。
如果有人能引导我走上正确的道路,我将感激不尽!
谢谢!
答案 0 :(得分:1)
我会尝试解释额外的元素0.
def check():
if len(nameOne.get()) == 0 or len(nameTwo.get()) == 0 or len(comment.get(INSERT)) == 0:
showwarning()
else:
print 'True'
check()
你应该在malloc:
之后用一些值初始化列表的头部test_list = malloc(sizeof(node_t)); //this changes the pointer test_list
//which is initially NULL to a non-NULL pointer, hence the mysterious extra element "0"
push(test_list, 1);
void push(node_t * head, int val) {
if (head == NULL) //head is not NULL at this point because you called malloc earlier on it, so 1 will be inserted in the next position
{...}
现在,第一个元素不是0,它将是5。
答案 1 :(得分:1)
如果您在代码中取消注释以下行
//test_list = malloc(sizeof(node_t));
这里是在调用push函数之前分配头指针。 因此,下面的代码行永远不会被执行
if (head == NULL)
{
head = new_node(head);
head->val = val;
head->next = NULL;}
因为你已经为头指针进行了一次malloced,你还没有初始化它,然后是两个推送函数。所以你会在列表中看到0 / garbage,1,2而不是1,2。
当您为test_list注释malloc时,请在下面的代码中
if (head == NULL)
{
head = new_node(head);
head->val = val;
head->next = NULL;
}else
{
node_t * current = head;
while (current->next != NULL) {
current = current->next;
}
由于您没有发送test_list的地址(& test_list-您需要使用双指针),因此if case
中所做的任何更改都不会反映在test_list中。
浏览链接以便清楚了解 - linked_list
答案 2 :(得分:0)
尝试以下功能。
node_t * new_node( int val )
{
node_t * n = malloc( sizeof( node_t ) );
if ( n )
{
n->val = val;
n->next = NULL;
}
return n;
}
void push( node_t **head, int val )
{
node_t *n = new_node( val );
if ( n )
{
while ( *head ) head = &( *head )->next;
*head = n;
}
}
必须像
一样调用函数pushpush( &test_list, 1 );
至于您的功能push
实施,它会处理test_list
的副本。因此test_list
的原始值不会更改。
答案 3 :(得分:0)
来自莫斯科的Vlad和Violeta Marin已经说明了它不起作用的原因。我做了一些修改在你的代码中使其工作,
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int val;
struct node * next;
} node_t;
void print_list(node_t * head)
{
node_t * current = head;
printf("called\n");
while (current != NULL) {
printf("%d\n", current->val);
current = current->next;
}
}
node_t* new_node()
{
//you have to return NULL , if malloc fails to allocate memory
node_t * head2 = malloc(sizeof(node_t));
return head2;
}
void push(node_t **head, int val)
{
if (*head == NULL)
{
printf("null\n");
//you have to check the return value of new_node
(*head) = new_node();
(*head)->val = val;
(*head)->next = NULL;
}
else {
printf("not null\n");
node_t * current = *head;
while (current->next != NULL) {
current = current->next;
}
/* now we can add a new variable */
//you have to check the return value of malloc
current->next = malloc(sizeof(node_t));
current->next->val = val;
current->next->next = NULL;
}
}
void my_free(node_t *head)
{
node_t *temp= NULL;
while(head)
{
temp=head->next;
free(head);
head=temp;
}
}
int main ()
{
node_t *test_list = NULL;
push(&test_list, 1);
push(&test_list, 2);
print_list(test_list);
my_free(test_list);
return 0;
}
答案 4 :(得分:0)
以下代码:
{{1}}