我正在使用字符链表,我需要创建一个函数来弹出链表的第一个元素,即:删除第一个节点,释放空间并返回保存在第一个节点中的字符。
我创建了一个代码,可以在程序的主函数中完美地做到这一点,但是当我将这部分代码放入函数中时,它停止工作,我不知道为什么。
我正在使用 ATmega328p,这个想法是将字符发送到计算机(我使用 minicom 作为终端模拟器),因此函数 USART_Transmit_char() 将字符发送到计算机。
主函数中的代码在主函数中完美运行,而主函数中的流行音乐是这样的:
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(".rnrn");
//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(".rnrn");
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(".rnrn");
}
节点的结构和推送函数是:
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.
当我更改代码中为具有完全相同代码的函数定义的 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(".rnrn");
//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(".rnrn");
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(".rnrn");
}
函数 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
是一个局部变量,与main()
中的string
无关 - 它只是main()
中string
值的副本 - 或者直到您修改它。
您需要额外的间接寻址级别,以便从main()
传递指向string
对象的指针:
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 ) ;