我可以在主代码中弹出链表的第一个元素(char),但我不能将该部分代码放入函数中
我正在处理字符的链表,我需要创建一个函数来弹出链表的第一个元素,即:删除第一个节点,释放空间并返回保存在第一个节点中的字符 我在程序的主函数中创建了一个完美的代码,但当我将这部分代码放入函数中时,它就停止工作了,我不知道为什么 我正在使用ATmega328p,想法是将字符发送到计算机(我使用minicom作为终端仿真器),因此函数USART_Transmit_char()将字符发送到计算机 与主函数中的pop完美配合的主函数中的代码如下:我可以在主代码中弹出链表的第一个元素(char),但我不能将该部分代码放入函数中,c,atmega,C,Atmega,我正在处理字符的链表,我需要创建一个函数来弹出链表的第一个元素,即:删除第一个节点,释放空间并返回保存在第一个节点中的字符 我在程序的主函数中创建了一个完美的代码,但当我将这部分代码放入函数中时,它就停止工作了,我不知道为什么 我正在使用ATmega328p,想法是将字符发送到计算机(我使用minicom作为终端仿真器),因此函数USART_Transmit_char()将字符发送到计算机 与主函数中的pop完美配合的主函数中的代码如下: int main(void) { //U
int main(void)
{
//USART CONFIGURATION
struct USART_configuration config_57600_8N1 = {57600, 8,1,'n'};
USART_Init(config_57600_8N1);
//END USART CONFIGURATION
//CEATES THE FIRST NODE OF LINKED LIST
node_char * string = NULL;
string = malloc(sizeof(node_char));
string->val = 'H';
string->next = NULL;
//ADD ELEMENTS TO LINKED LIST
push(string,'O');
push(string,'L');
push(string,'A');
//COMMUNICATION WITH COMPUTER
USART_Transmit_String("I received this line: ");
USART_Transmit_char(string->val);
USART_Transmit_char(string->next->val);
USART_Transmit_char(string->next->next->val);
USART_Transmit_char(string->next->next->next->val);
USART_Transmit_String(".\r\n\r\n");
//HERE I POP THE FIRST ELEMENT
node_char * next_node = NULL;
char popped = string->val;
next_node = string->next;
free(string);
string = next_node;
//HERE THE FIRST ELEMENT HAS BEEN POPPED
//COMMUNICATION WITH COMPUTER
USART_Transmit_String("I popped this char: ");
USART_Transmit_char(popped);
USART_Transmit_String(".\r\n\r\n");
USART_Transmit_String("I am left with this: ");
USART_Transmit_char(string->val);
USART_Transmit_char(string->next->val);
USART_Transmit_char(string->next->next->val);
USART_Transmit_String(".\r\n\r\n");
}
节点的结构和推送功能是:
typedef struct node {
char val;
struct node * next;
} node_char;
void push(node_char * string, char val) {
node_char * current = string;
while (current->next != NULL) {
current = current->next;
}
current->next = malloc(sizeof(node_char));
current->next->val = val;
current->next->next = NULL;
}
结果是:
I recived this line: HOLA.
I popped this char: H.
I am left whit this: OLA.
I recived this line: HOLA.
I popped this char: H.
I am left whit this:
.
当我为一个具有完全相同代码的函数定义的appart更改弹出craracter的代码部分时,问题就出现了
新的主要代码是:
int main(void)
{
//USART CONFIGURATION
struct USART_configuration config_57600_8N1 = {57600, 8,1,'n'};
USART_Init(config_57600_8N1);
//END USART CONFIGURATION
//CEATES THE FIRST NODE OF LINKED LIST
node_char * string = NULL;
string = malloc(sizeof(node_char));
string->val = 'H';
string->next = NULL;
//ADD ELEMENTS TO LINKED LIST
push(string,'O');
push(string,'L');
push(string,'A');
//COMMUNICATION WITH COMPUTER
USART_Transmit_String("I received this line: ");
USART_Transmit_char(string->val);
USART_Transmit_char(string->next->val);
USART_Transmit_char(string->next->next->val);
USART_Transmit_char(string->next->next->next->val);
USART_Transmit_String(".\r\n\r\n");
//HERE I POP THE FIRST ELEMENT
char popped = pop(string);
//HERE THE FIRST ELEMENT HAS BEEN POPPED
//COMMUNICATION WITH COMPUTER
USART_Transmit_String("I popped this char: ");
USART_Transmit_char(popped);
USART_Transmit_String(".\r\n\r\n");
USART_Transmit_String("I am left with this: ");
USART_Transmit_char(string->val);
USART_Transmit_char(string->next->val);
USART_Transmit_char(string->next->next->val);
USART_Transmit_String(".\r\n\r\n");
}
pop函数定义如下:
char pop(node_char * string) {
node_char * next_node = NULL;
char popped = string->val;
next_node = string->next;
free(string);
string = next_node;
return popped;
}
结果是:
I recived this line: HOLA.
I popped this char: H.
I am left whit this: OLA.
I recived this line: HOLA.
I popped this char: H.
I am left whit this:
.
(请注意,(.)打印在下一行)
我不明白为什么它在函数中定义了相同的代码时不起作用
有人知道为什么会这样吗?我尝试了许多不同的方法来解决这个问题,结果不同,但从来没有达到预期的效果。在函数pop()
中,您分配local
参数string
:
string = next_node;
但是这里的string
是一个局部变量,与main()
中的string
没有关联-它只是main()
中string
的值的副本-或者在您修改它之前一直存在
您需要一个额外的间接级别,以便从main()
传递指向string
对象的指针:
然后打电话:
char popped = pop( &string ) ;
此赋值
string=next\u节点代码>在返回pop
函数后失效。