我可以在主代码中弹出链表的第一个元素(char),但我不能将这部分代码放在函数中

问题描述 投票:0回答:1

我正在使用链接的字符列表,我需要创建一个弹出链表的第一个元素的函数,即:删除第一个节点,释放空格并返回保存在第一个节点中的字符。

我创建了一个代码,它在程序的主要功能中完美地完成了这个,但是当我把这部分代码放到一个函数中时,它停止工作,我无法找出原因。

我正在使用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: 
                      .

(注意,(。)打印在下一行)

我无法弄清楚为什么当它在函数中定义相同的代码时它不起作用。

有没有人知道为什么会这样?我已经尝试了很多不同的方法来解决问题,结果不同但从未得到理想的结果。

c atmega
1个回答
1
投票

在函数pop()中,您分配local参数string

string = next_node;

但是这里string是一个局部变量,与string中的main()无关 - 它只是stringmain()值的副本 - 或者直到你修改它。

您需要一个额外的间接级别,以便从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 ) ;
© www.soinside.com 2019 - 2024. All rights reserved.