我正在使用链接的字符列表,我需要创建一个弹出链表的第一个元素的函数,即:删除第一个节点,释放空格并返回保存在第一个节点中的字符。
我创建了一个代码,它在程序的主要功能中完美地完成了这个,但是当我把这部分代码放到一个函数中时,它停止工作,我无法找出原因。
我正在使用ATmega328p,其想法是将字符发送到计算机(我使用minicom作为终端模拟器),因此USART_Transmit_char()函数向计算机发送一个字符。
主函数中与主函数中的pop完美配合的代码是这样的:
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");
}
节点和push函数的结构是:
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.
当我更改弹出字符的代码部分时,问题就出现了,该函数定义为具有完全相同代码的函数。
新的主要代码是:
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:
.
(注意,(。)打印在下一行)
我无法弄清楚为什么当它在函数中定义相同的代码时它不起作用。
有没有人知道为什么会这样?我已经尝试了很多不同的方法来解决问题,结果不同但从未得到理想的结果。
在函数pop()
中,您分配local
参数string
:
string = next_node;
但是这里string
是一个局部变量,与string
中的main()
无关 - 它只是string
中main()
值的副本 - 或者直到你修改它。
您需要一个额外的间接级别,以便从string
传递指向main()
对象的指针:
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;
}
然后打电话:
char popped = pop( &string ) ;