C 链表的实现
C Implementation of linkedlist
我正在尝试打印存储在链表中的值,但我 运行 正在进入无限 loop.Please 谁能告诉我我的代码有什么问题。我能够成功收集节点的数据,但是在将列表打印时,我 运行 进入连续循环。任何帮助将不胜感激。提前致谢
#include <stdio.h>
#include <stdlib.h>
struct node {
int data; //4 bytes
struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
};
int main(){
struct node *head,*newnode,*temp;
head = NULL ;
temp = head;
int count=0, choice=1;
while(choice){
newnode = (struct node *)malloc(sizeof(struct node));
printf("Enter data:");
scanf("%d",&newnode-> data);
newnode->next = head;
if(head == 0){
head = temp = newnode;
}
else{
temp->next = newnode;
temp = newnode;
}
printf(" %d ",temp->data);
printf("Do you want to continue? 0/1");
scanf("%d",&choice);
}
int i = 0;
temp = head;
while( temp!=NULL){
printf("%d ",temp->data);
temp=temp->next;
}
}
创建新节点时,将其“下一个”节点设置为头节点。这就是循环的制作方式。
将其设置为 NULL。
然后将新节点设置为“当前节点的下一个节点”和“当前节点”。
我相信您想将它设置为 temp 的下一个节点,然后将 temp 移动到它的下一个节点。
此外,请不要将 head 与 0 进行比较...如果您希望它为 NULL,则与 NULL 进行比较。
我怀疑它是否在所讨论的作业问题的范围内,但是将链表任务分解为更小的问题确实很有帮助。
我们从这个节点定义开始:
struct node {
int data; //4 bytes
struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
};
我将对其进行 typedef 以使我的生活稍微轻松一些。
typedef struct node {
int data; //4 bytes
struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
} node_t;
让我们找到给定头的最后一个节点。我们将创建一个名为 current
的 node_t
指针,并使用它遍历列表直到到达最后一个节点。我们会知道它是最后一个,因为它的 next
成员将是 NULL
。当然,如果head
是NULL
,那么我们就直接returnNULL
。
node_t *last_node(node_t *head) {
if (head == NULL) {
return NULL;
}
node_t *current;
for (current = head; current->next != NULL; current = current->next);
return current;
}
现在,让我们向具有给定头部的列表添加一个值。我们可以通过 return 指向新的最后一个节点的指针来提供快捷方式。如果 head
是 NULL
.
,我们也会缩短很多工作
否则我们将使用我们定义的 last_node
函数获取最后一个节点,将其 next
设置为新节点,并 return 指向新节点的指针。
node_t *add_to_list(node_t *head, int value) {
node_t * new_node = malloc(sizeof(node_t));
new_node->data = value;
new_node->next = NULL;
if (head == NULL) {
return new_node;
}
node_t *last = last_node(head);
last->next = new_node;
return new_node;
}
最后我们可以编写一个函数来打印列表。鉴于您已经看过遍历列表,这应该看起来很熟悉。
void print_list(node_t *head) {
for (node_t *current = head;
current->next != NULL;
current = current->next) {
printf("%d ", current->data);
}
}
将大问题分解成小问题至关重要。练习吧!
我正在尝试打印存储在链表中的值,但我 运行 正在进入无限 loop.Please 谁能告诉我我的代码有什么问题。我能够成功收集节点的数据,但是在将列表打印时,我 运行 进入连续循环。任何帮助将不胜感激。提前致谢
#include <stdio.h>
#include <stdlib.h>
struct node {
int data; //4 bytes
struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
};
int main(){
struct node *head,*newnode,*temp;
head = NULL ;
temp = head;
int count=0, choice=1;
while(choice){
newnode = (struct node *)malloc(sizeof(struct node));
printf("Enter data:");
scanf("%d",&newnode-> data);
newnode->next = head;
if(head == 0){
head = temp = newnode;
}
else{
temp->next = newnode;
temp = newnode;
}
printf(" %d ",temp->data);
printf("Do you want to continue? 0/1");
scanf("%d",&choice);
}
int i = 0;
temp = head;
while( temp!=NULL){
printf("%d ",temp->data);
temp=temp->next;
}
}
创建新节点时,将其“下一个”节点设置为头节点。这就是循环的制作方式。 将其设置为 NULL。
然后将新节点设置为“当前节点的下一个节点”和“当前节点”。 我相信您想将它设置为 temp 的下一个节点,然后将 temp 移动到它的下一个节点。
此外,请不要将 head 与 0 进行比较...如果您希望它为 NULL,则与 NULL 进行比较。
我怀疑它是否在所讨论的作业问题的范围内,但是将链表任务分解为更小的问题确实很有帮助。
我们从这个节点定义开始:
struct node {
int data; //4 bytes
struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
};
我将对其进行 typedef 以使我的生活稍微轻松一些。
typedef struct node {
int data; //4 bytes
struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
} node_t;
让我们找到给定头的最后一个节点。我们将创建一个名为 current
的 node_t
指针,并使用它遍历列表直到到达最后一个节点。我们会知道它是最后一个,因为它的 next
成员将是 NULL
。当然,如果head
是NULL
,那么我们就直接returnNULL
。
node_t *last_node(node_t *head) {
if (head == NULL) {
return NULL;
}
node_t *current;
for (current = head; current->next != NULL; current = current->next);
return current;
}
现在,让我们向具有给定头部的列表添加一个值。我们可以通过 return 指向新的最后一个节点的指针来提供快捷方式。如果 head
是 NULL
.
否则我们将使用我们定义的 last_node
函数获取最后一个节点,将其 next
设置为新节点,并 return 指向新节点的指针。
node_t *add_to_list(node_t *head, int value) {
node_t * new_node = malloc(sizeof(node_t));
new_node->data = value;
new_node->next = NULL;
if (head == NULL) {
return new_node;
}
node_t *last = last_node(head);
last->next = new_node;
return new_node;
}
最后我们可以编写一个函数来打印列表。鉴于您已经看过遍历列表,这应该看起来很熟悉。
void print_list(node_t *head) {
for (node_t *current = head;
current->next != NULL;
current = current->next) {
printf("%d ", current->data);
}
}
将大问题分解成小问题至关重要。练习吧!