此程序基于链接列表。每次Insert(x)
中调用main()
时,它都会在列表的开头添加元素。代码中的大箭头指向我不确定我是否正确的部分。我的问题列举如下:
问题1。代码在global structure pointer head
函数中创建一个Node
类型的Node和一个指向结构Insert()
的本地指针。第一个箭头指向temp->next = head
的代码。这是否意味着我们传递的是temp->接下来的头部地址或头部内部的值?我想这个价值 - 请确认。
假设我有案例:
int a= 2;
int *p;
然后p= &a;
表示p
的地址为a
,但此处的代码似乎为p=a
,即指针temp->next = head
这里next pointer= head
表示我们正在传递头节点内的值。如果是地址而不是我们应该使用&head
?
问题2。在下一个箭头head = temp
中。我清楚地看到我们正在将临时地址传递给头部?这是对的吗?或者是说温度的地址是临时的?
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node *next;
};
struct Node* head;
void Insert(int x)
{
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
temp->data=x;
temp->next = head; <------------------------------- (1)
head= temp; <------------------------------- (2)
}
void Print()
{
struct Node * temp= head;
printf("List is: ");
while(temp != NULL)
{
printf("%d ", temp->data);
temp= temp->next;
}
printf("\n");
}
int main()
{
head =NULL;
int n, i, x;
printf("How many Numbers?: \n");
scanf("%d", &n);
for(i= 0; i<n; i++)
{
printf("Enter the number: ");
scanf("%d",&x);
Insert(x);
Print();
}
return 0;
}
答案 0 :(得分:4)
您的第一个问题:
你声明一个名为head的指针:
struct Node* head;
指针是指向内存中值的地址。 当你这样做时:
temp->next = head;
然后将指针 head 分配给 temp-&gt; next 。所以它不是head的值,而是指向值的地址。
你的第二个问题:
首先声明一个指针temp,然后为它分配一些内存:
struct Node* temp = malloc(sizeof(struct Node));
然后将其分配给head(头指针现在指向临时分配的内存):
head= temp;
两者都是指针,因此您将 temp 指针保存在 head 指针中。而已。例如: 让我们说你的 head 指针指向0001。你的 temp 指针指向地址0002.如果你做 head = temp ,那么头将指向地址0002。
示例:
struct Node node1;
node1不是指针,因此它具有值。如果你想从指针中取出一个指针,那么你需要获取node1的地址:
struct Node *node1Pointer = &node1;
&amp; node1 表示node1的地址。
如果您现在想要 node1 的值并从 node1Pointer 获取它,那么您必须取消引用它:
struct Node node2 = *node1Pointer;
* nodePointer 表示,给我指针指向的值。
现在让我们假设你有一个node1,它有一个带有地址0001的指针 node1Pointer 。你有另一个 node2Pointer 节点 node2 这指向了0002。
请考虑以下事项:
struct Node *tempNodePointer = node2Pointer;
tempNodePointer 指向地址0002
node2Pointer = node1Pointer;
node2Pointer 现在指向地址0001
node1Pointer = 0;
node1Pointer 现在指向空,nullpointer
struct Node nodeValue = *node2Pointer;
nodeValue 现在具有存储在地址0001
的值 node1Pointer = &nodeValue;
node1Pointer 现在指向地址0001
这可能会更好地澄清一下。
我希望它可以帮助你。
答案 1 :(得分:1)
你的代码有很多bug。使用链接列表时,您需要有一个START指针,用于存储列表中第一个节点的地址,否则您将无法访问该列表。在不断向列表中添加节点时,头节点将遍历到最后一个节点,并且不能将其作为起始节点。你的问题的答案已经由@fonZ给出。我建议您使用以下代码在链表中创建和插入节点。
void create()
{
int term,i;
char ch;
do
{
temp=(struct node *)malloc(sizeof(struct node));
printf("\nEnter the data : ");
scanf("%d",&temp->data);
temp->next=0;
if(start==0)
{
start=temp;
curr=temp;
}
else
{
curr->next=temp;
curr=temp;
}
printf("Do you want to create another node?y\\n.. ");
ch=getche();
}while(ch!='n');
}
void insert(int pos,int val)
{
int count=1;
temp=(struct node*)malloc(sizeof(struct node));
temp->next=0;
temp->data=val;
if(pos==1)
{
if(start==0)
start=temp;
else
{
temp->next=start;
start=temp;
}
}
else
{
curr=start;
while(count!=pos)
{
prev=curr;
curr=curr->next;
count++;
}
temp->next=prev->next;
prev->next=temp;
}
}
答案 2 :(得分:1)
我建议你通过这个人关于链接列表的视频教程,几周前我已经完成了它们,它们真的很棒!
https://www.youtube.com/watch?v=j-3Eu2W1mLw&list=UUbPdqdBDQegnYMXTpcgbNEw