最后是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); }