【发布时间】:2023-03-19 10:17:01
【问题描述】:
所以我目前正在学习 C 中的链接列表,我对创建链接列表和插入节点时使用的一些分配有一些疑问。我希望了解内存是如何在后台工作的。
struct node {
int data;
struct node *next
}
void createList(int n, struct node *head)
{
struct node *temp, *newnode;
//Assignment 1
temp = head;
//Assignment2
temp->next = newnode
//somethings
}
一些上下文:head 不包含任何数据。它只是第一个入口点节点,它指向包含任何数据的第一个节点?
temp用于遍历,newnode是新创建的节点,后面改成temp。
上述两个作业在内存方面是如何工作的? 在作业 1 中,我是在复制内容还是两个名称指向同一个位置? 作业 2 也有同样的疑问。
已更新,重要代码如下。
int menu()
{
int choice = 0;
printf("\n\t\tMENU\n1.Create Linked List");
printf("\n2.Display Linked List");
printf("\nAny other number to exit\n");
printf("\nEnter Choice : ");
scanf("%d", &choice);
return choice;
}
void createList(int n, struct node *head)
{
int data;
struct node *temp, *newNode;
temp = head; // 'head' node with no data pointing towards 'temp'
for (int i = 1; i <= n; i++)
{
newNode = malloc(sizeof(struct node));
printf("Enter Data %d : ", i);
scanf("%d", &data);
newNode->data = data; // First Node
newNode->next = NULL;
temp->next = newNode;
temp = temp->next;
}
}
void displayList(struct node *head)
{
struct node *temp;
temp = head->next; // Link to First Node
int i = 1;
printf("\nStart Display\n");
while (temp != NULL)
{
printf("\nData %d : %d\n", i, temp->data);
temp = temp->next;
i++;
}
}
void main()
{
int choice, n;
struct node *head;
head = malloc(sizeof(struct node));
head->next = NULL;
label:
choice = menu();
switch (choice)
{
case 1:
printf("Enter Number of Entries : ");
scanf("%d", &n);
createList(n, head);
goto label;
break;
case 2:
displayList(head);
goto label;
break;
default:
printf("Wrong Choice");
exit(0);
break;
}
}
编辑 2: 另一个疑问:
temp = temp->next
这用于遍历,但它是如何工作的。 “下一个”是“结构节点”中的一个子位置,它的地址指向下一个节点,对吗? 那么这个分配在内存位置会发生什么?
非常感谢您的帮助,因为这个主题变得非常难以理解。
【问题讨论】:
-
在两个赋值中唯一被复制的是指针。第二个赋值
temp->next = newnode;无效,因为newnode包含未初始化的值。 -
什么时候赋值 'temp=head' 是否有两个不同的指针命名为 'temp' 或 'head' 或者它们都指向内存中的相同位置?
-
@ThomasAMathew 相同位置。
-
@Imonninger 。谢谢
-
head在传递给createList之前如何初始化?
标签: c pointers struct linked-list variable-assignment