最后是C链表插入节点

我的插入方法在C中的链接列表时遇到了一些问题。它似乎只在列表的开头添加。 我做的任何其他插入失败。 而这个CodeBlocks调试器很难理解我仍然没有得到它。 它永远不会给我价值,只有内存中的地址。 无论如何这是我的function。 你有没有看到它失败的原因?

/* function to add a new node at the end of the list */ int addNodeBottom(int val, node *head){ //create new node node *newNode = (node*)malloc(sizeof(node)); if(newNode == NULL){ fprintf(stderr, "Unable to allocate memory for new node\n"); exit(-1); } newNode->value = val; //check for first insertion if(head->next == NULL){ head->next = newNode; printf("added at beginning\n"); } else { //else loop through the list and find the last //node, insert next to it node *current = head; while(current->next != NULL) { if(current->next == NULL) { current->next = newNode; printf("added later\n"); } current = current->next; } } return 0; } 

然后在main中,仅添加了929。

  //testing addNodeBottom function addNodeBottom(929, head); addNodeBottom(98, head); addNodeBottom(122, head); addNodeBottom(11, head); addNodeBottom(1034, head); 

这段代码可行。 samplebias的答案几乎是正确的,但您需要进行第三次更改:

 int addNodeBottom(int val, node *head){ //create new node node *newNode = (node*)malloc(sizeof(node)); if(newNode == NULL){ fprintf(stderr, "Unable to allocate memory for new node\n"); exit(-1); } newNode->value = val; newNode->next = NULL; // Change 1 //check for first insertion if(head->next == NULL){ head->next = newNode; printf("added at beginning\n"); } else { //else loop through the list and find the last //node, insert next to it node *current = head; while (true) { // Change 2 if(current->next == NULL) { current->next = newNode; printf("added later\n"); break; // Change 3 } current = current->next; }; } return 0; } 

更改1: newNode->next必须设置为NULL因此我们不会在列表末尾插入无效指针。

改变2/3:循环变为无限循环,随着break; 当我们找到最后一个元素。 注意while(current->next != NULL)如何if(current->next == NULL)之前是矛盾的。

编辑:关于while循环,这种方式更好:

  node *current = head; while (current->next != NULL) { current = current->next; } current->next = newNode; printf("added later\n"); 

malloc node之后,请确保设置node->next = NULL

 int addNodeBottom(int val, node *head) { node *current = head; node *newNode = (node *) malloc(sizeof(node)); if (newNode == NULL) { printf("malloc failed\n"); exit(-1); } newNode->value = val; newNode->next = NULL; while (current->next) { current = current->next; } current->next = newNode; return 0; } 

我应该指出,在这个版本中, head仍然用作虚拟,不用于存储值。 这使您可以通过仅具有head节点来表示空列表。

在编写代码之前,我想提一下密钥供您考虑。

//键

temp = malloc函数分配的新节点的地址(C中的成员od alloc.h库)

prev =现有链接列表的最后一个节点的地址。

next =包含下一个节点的地址

 struct node { int data; struct node *next; } *head; void addnode_end(int a) { struct node *temp, *prev; temp = (struct node*) malloc(sizeof(node)); if (temp == NULL) { cout << "Not enough memory"; } else { node->data = a; node->next = NULL; prev = head; while (prev->next != NULL) { prev = prev->next; } prev->next = temp; } } 

始终在给定链接列表的最后一个节点之后添加新节点。 例如,如果给定的链接列表是5-> 10-> 15-> 20-> 25并且我们在末尾添加项目30,则链接列表变为5-> 10-> 15-> 20-> 25- > 30。 由于链接列表通常由其头部表示,因此我们必须遍历列表直到结束,然后将最后一个节点更改为新节点。

 /* Given a reference (pointer to pointer) to the head of a list and an int, appends a new node at the end */ void append(struct node** head_ref, int new_data) { /* 1. allocate node */ struct node* new_node = (struct node*) malloc(sizeof(struct node)); struct node *last = *head_ref; /* used in step 5*/ /* 2. put in the data */ new_node->data = new_data; /* 3. This new node is going to be the last node, so make next of it as NULL*/ new_node->next = NULL; /* 4. If the Linked List is empty, then make the new node as head */ if (*head_ref == NULL) { *head_ref = new_node; return; } /* 5. Else traverse till the last node */ while (last->next != NULL) last = last->next; /* 6. Change the next of last node */ last->next = new_node; return; } 

这很好用:

 struct node *addNode(node *head, int value) { node *newNode = (node *) malloc(sizeof(node)); newNode->value = value; newNode->next = NULL; if (head == NULL) { // Add at the beginning head = newNode; } else { node *current = head; while (current->next != NULL) { current = current->next; }; // Add at the end current->next = newNode; } return head; } 

用法示例:

 struct node *head = NULL; for (int currentIndex = 1; currentIndex < 10; currentIndex++) { head = addNode(head, currentIndex); }