如何在C中的链表中动态存储数据?
How to store the data dynamically in linked list in C?
我正在尝试将值动态存储在链表中。
我希望用户输入链表的大小。然后根据我想要分配内存的输入(即如果输入:3 则应创建三个节点)。
如果为节点分配了内存,那么我将 head
节点存储在 temp
.
中
之后我想将数据存储在列表中,直到列表结束
我使用的算法如下
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
// Printing the list
void printList(struct node *ptr)
{
int i = 1;
while(ptr != NULL)
{
printf("\n Value in Node %d : %d",i ,ptr->data);
ptr = ptr->next;
i++;
}
}
int main()
{
int n;
struct node *head;
struct node *temp;
printf("\n Enter the size of linkedList : ");
scanf("%d",&n);
head = malloc(sizeof(struct node) * n);
// Storing head in temp
temp = head;
int i = 1; // Keep track on the position of the list
while(temp != NULL) // Untill temp get to end of the list
{
printf("\n Enter the value in node %d : ", i);
scanf("%d",&temp->data);
temp = temp->next; // Assinging next list address
}
printList(head);
return 0;
}
我不明白为什么我执行的时候只打印一个值。
我不知道我哪里错了?
**输出:**
$ clang dynamicList.c -o a
$ ./a
Enter the size of linkedList : 10
Enter the value in node 1 : 9
Value in Node 1 : 9
当你创建一个新节点时,你应该分配下一个节点,然后将当前节点移动到下一个节点。另外,您应该注意初始状态(当大小为 1 时)。您应该像这样修改您的代码:
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* next;
};
// Printing the list
void printList(struct node* ptr) {
while (ptr != NULL) {
int i = 1;
printf("\n Value in Node %d : %d", i, ptr->data);
ptr = ptr->next;
}
}
int main() {
int n;
struct node* head;
struct node* temp;
printf("\n Enter the size of linkedList : ");
scanf("%d", &n);
int i = 1; // Keep track on the position of the list
while (i <= n) // Untill temp get to end of the list
{
if (i == 1) {
head = malloc(sizeof(struct node) * n);
temp = head;
} else {
temp->next = malloc(sizeof(struct node) * n);
temp = temp->next;
}
printf("\n Enter the value in node %d : ", i);
scanf("%d", &temp->data);
++i;
}
printList(head);
return 0;
}
此外,您应该在程序结束时释放动态分配的内存以避免内存泄漏。
这次malloc的调用
head = malloc(sizeof(struct node) * n);
分配未初始化的内存。
因此while循环中的这条语句
temp = temp->next;
将不确定的值分配给指针 temp
并在循环中进一步使用此指针会调用未定义的行为。
而且循环中的条件
while(temp != NULL) // Untill temp get to end of the list
没有意义。
这个声明在循环的块范围内
int i = 1; // Keep track on the position of the list
和函数中的类似声明printList
int i = 1;
也说不通。
您需要刚好初始化 n
个节点。所以循环应该看起来像
for ( int i = 0; i < n; i++ )
{
//...
}
此外,当列表不再需要时,您应该释放所有分配的内存。
注意你分配了一个节点数组。使用您的方法,程序可以如下所示。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
// Printing the list
void printList( const struct node *ptr )
{
for ( unsigned int i = 1; ptr != NULL; ptr = ptr->next )
{
printf( "Value in Node %u : %d\n", i++, ptr->data );
}
}
int main( void )
{
unsigned int n = 0;
struct node *head = NULL;
printf( "Enter the size of linkedList : " );
scanf( "%u", &n );
head = malloc( n * sizeof( struct node ) );
struct node *temp = head;
for ( unsigned int i = 0; i < n; i++ )
{
printf( "Enter the value in node %u : ", i + 1 );
scanf( "%d", &temp->data );
temp->next = i == n - 1 ? NULL : temp + 1;
++temp;
}
printList( head );
free( head );
return 0;
}
程序输出可能看起来像
Enter the size of linkedList : 10
Enter the value in node 1 : 1
Enter the value in node 2 : 2
Enter the value in node 3 : 3
Enter the value in node 4 : 4
Enter the value in node 5 : 5
Enter the value in node 6 : 6
Enter the value in node 7 : 7
Enter the value in node 8 : 8
Enter the value in node 9 : 9
Enter the value in node 10 : 10
Value in Node 1 : 1
Value in Node 2 : 2
Value in Node 3 : 3
Value in Node 4 : 4
Value in Node 5 : 5
Value in Node 6 : 6
Value in Node 7 : 7
Value in Node 8 : 8
Value in Node 9 : 9
Value in Node 10 : 10
如果您确实想将数据组织为列表而不是数组,那么程序可以采用以下方式
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
// Printing the list
void printList( const struct node *ptr )
{
for ( unsigned int i = 1; ptr != NULL; ptr = ptr->next )
{
printf( "Value in Node %u : %d\n", i++, ptr->data );
}
}
int main( void )
{
unsigned int n = 0;
struct node *head = NULL;
printf( "Enter the size of linkedList : " );
scanf( "%u", &n );
struct node *temp;
for ( unsigned int i = 0; i < n; i++ )
{
if ( i == 0 )
{
head = malloc( sizeof( struct node ) );
temp = head;
}
else
{
temp->next = malloc( sizeof( struct node ) );
temp = temp->next;
}
printf( "Enter the value in node %u : ", i + 1 );
scanf( "%d", &temp->data );
temp->next = NULL;
}
printList( head );
while ( head != NULL )
{
temp = head;
head = head->next;
free( temp );
}
return 0;
}
程序输出可能与上一个演示程序所示的一样。
我正在尝试将值动态存储在链表中。
我希望用户输入链表的大小。然后根据我想要分配内存的输入(即如果输入:3 则应创建三个节点)。
如果为节点分配了内存,那么我将 head
节点存储在 temp
.
之后我想将数据存储在列表中,直到列表结束
我使用的算法如下
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
// Printing the list
void printList(struct node *ptr)
{
int i = 1;
while(ptr != NULL)
{
printf("\n Value in Node %d : %d",i ,ptr->data);
ptr = ptr->next;
i++;
}
}
int main()
{
int n;
struct node *head;
struct node *temp;
printf("\n Enter the size of linkedList : ");
scanf("%d",&n);
head = malloc(sizeof(struct node) * n);
// Storing head in temp
temp = head;
int i = 1; // Keep track on the position of the list
while(temp != NULL) // Untill temp get to end of the list
{
printf("\n Enter the value in node %d : ", i);
scanf("%d",&temp->data);
temp = temp->next; // Assinging next list address
}
printList(head);
return 0;
}
我不明白为什么我执行的时候只打印一个值。
我不知道我哪里错了?
**输出:**
$ clang dynamicList.c -o a
$ ./a
Enter the size of linkedList : 10
Enter the value in node 1 : 9
Value in Node 1 : 9
当你创建一个新节点时,你应该分配下一个节点,然后将当前节点移动到下一个节点。另外,您应该注意初始状态(当大小为 1 时)。您应该像这样修改您的代码:
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* next;
};
// Printing the list
void printList(struct node* ptr) {
while (ptr != NULL) {
int i = 1;
printf("\n Value in Node %d : %d", i, ptr->data);
ptr = ptr->next;
}
}
int main() {
int n;
struct node* head;
struct node* temp;
printf("\n Enter the size of linkedList : ");
scanf("%d", &n);
int i = 1; // Keep track on the position of the list
while (i <= n) // Untill temp get to end of the list
{
if (i == 1) {
head = malloc(sizeof(struct node) * n);
temp = head;
} else {
temp->next = malloc(sizeof(struct node) * n);
temp = temp->next;
}
printf("\n Enter the value in node %d : ", i);
scanf("%d", &temp->data);
++i;
}
printList(head);
return 0;
}
此外,您应该在程序结束时释放动态分配的内存以避免内存泄漏。
这次malloc的调用
head = malloc(sizeof(struct node) * n);
分配未初始化的内存。
因此while循环中的这条语句
temp = temp->next;
将不确定的值分配给指针 temp
并在循环中进一步使用此指针会调用未定义的行为。
而且循环中的条件
while(temp != NULL) // Untill temp get to end of the list
没有意义。
这个声明在循环的块范围内
int i = 1; // Keep track on the position of the list
和函数中的类似声明printList
int i = 1;
也说不通。
您需要刚好初始化 n
个节点。所以循环应该看起来像
for ( int i = 0; i < n; i++ )
{
//...
}
此外,当列表不再需要时,您应该释放所有分配的内存。
注意你分配了一个节点数组。使用您的方法,程序可以如下所示。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
// Printing the list
void printList( const struct node *ptr )
{
for ( unsigned int i = 1; ptr != NULL; ptr = ptr->next )
{
printf( "Value in Node %u : %d\n", i++, ptr->data );
}
}
int main( void )
{
unsigned int n = 0;
struct node *head = NULL;
printf( "Enter the size of linkedList : " );
scanf( "%u", &n );
head = malloc( n * sizeof( struct node ) );
struct node *temp = head;
for ( unsigned int i = 0; i < n; i++ )
{
printf( "Enter the value in node %u : ", i + 1 );
scanf( "%d", &temp->data );
temp->next = i == n - 1 ? NULL : temp + 1;
++temp;
}
printList( head );
free( head );
return 0;
}
程序输出可能看起来像
Enter the size of linkedList : 10
Enter the value in node 1 : 1
Enter the value in node 2 : 2
Enter the value in node 3 : 3
Enter the value in node 4 : 4
Enter the value in node 5 : 5
Enter the value in node 6 : 6
Enter the value in node 7 : 7
Enter the value in node 8 : 8
Enter the value in node 9 : 9
Enter the value in node 10 : 10
Value in Node 1 : 1
Value in Node 2 : 2
Value in Node 3 : 3
Value in Node 4 : 4
Value in Node 5 : 5
Value in Node 6 : 6
Value in Node 7 : 7
Value in Node 8 : 8
Value in Node 9 : 9
Value in Node 10 : 10
如果您确实想将数据组织为列表而不是数组,那么程序可以采用以下方式
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
// Printing the list
void printList( const struct node *ptr )
{
for ( unsigned int i = 1; ptr != NULL; ptr = ptr->next )
{
printf( "Value in Node %u : %d\n", i++, ptr->data );
}
}
int main( void )
{
unsigned int n = 0;
struct node *head = NULL;
printf( "Enter the size of linkedList : " );
scanf( "%u", &n );
struct node *temp;
for ( unsigned int i = 0; i < n; i++ )
{
if ( i == 0 )
{
head = malloc( sizeof( struct node ) );
temp = head;
}
else
{
temp->next = malloc( sizeof( struct node ) );
temp = temp->next;
}
printf( "Enter the value in node %u : ", i + 1 );
scanf( "%d", &temp->data );
temp->next = NULL;
}
printList( head );
while ( head != NULL )
{
temp = head;
head = head->next;
free( temp );
}
return 0;
}
程序输出可能与上一个演示程序所示的一样。