我正在学习 C,在这个程序中我试图实现一个简单的链表。列表的每个节点都包含一个整数和一个指向下一个节点的指针。指针head
指向列表中的第一个节点,但最初列表是空的,所以我初始化了head = NULL
.
我想在列表上做两个操作 - 填充它,然后打印它。
为了填充列表,我insert_node
使用两个参数调用函数:head
和要插入的整数。
问题是我需要该函数insert_node
来更改值head
(因此它指向更新的列表,而不是 NULL)。我不知道该怎么做,所以我做head
了一个全局变量,我试图改变它的值。由于某种原因,即使head
函数内部的值发生了变化insert_node
,当我再次调用该函数时,head 的值仍然为 NULL。
问题:
为什么全局变量值不会全局更改?
我知道使用全局变量不是一个好习惯,那么如何正确更新指向列表的指针?我在考虑让
insert_node
函数实际上返回一个指向列表的指针,这是一个好方法吗?
#include<stdio.h> #include<stdlib.h> struct node { int data; struct node *link; }; void insert_node(struct node *head, int n); void print_list(struct node *head); struct node *head = NULL; main() { int i; for(i=1; i<5; i++) insert_node(head, i*i); print_list(head); } void print_list(struct node *head) { if(head == NULL) return; else { printf("%i ", head->data); print_list(head->link); } return; } void insert_node(struct node *head, int n) { struct node N = {n, NULL}; struct node *next, *prev; int prev_data = 0; //case one: list is empty - point head to N, and set N.link to NULL if(head == NULL) head = &N; //case two: n is less than first element in the list: else if(n < head->data) { N.link = head; head = &N; } else { next = head; //case three: N.data is equal to existing element, do nothing: while(next != NULL) { if(n == next->data) { printf("this element already exists.\n\n"); return; } prev = next; //save the current element next = next->link; //look at the next element } //case four: N.data is greater than last element: if(n > prev->data) { prev->link = &N; return; } //case five: N.data is in between list elements: next = head; while(next != NULL) { prev_data = next->data; //save the current element prev = next; //save pointer to current element next = next->link; //look at the next element if((n > prev_data) && (n < next->data)) { prev->link = &N; N.link = next; return; } } } return; }