C 在链表的开头插入节点
该程序基于链表。每次在C 在链表的开头插入节点,c,pointers,linked-list,C,Pointers,Linked List,该程序基于链表。每次在main()中调用Insert(x)时,它都会将元素添加到列表的开头。代码中的大箭头指向我不确定是否正确的部分。我的问题列举如下: 问题1。代码在Insert()函数中创建类型为Node的全局结构指针头,以及指向结构节点的本地指针。第一个箭头指向执行temp->next=head的代码。这是否意味着我们要在temp->next中传递head的地址或head中的值?我猜这个值--请确认 假设我有一个案例: int a= 2; int *p; 然后p=&a 意思是p的地址是a
main()
中调用Insert(x)
时,它都会将元素添加到列表的开头。代码中的大箭头指向我不确定是否正确的部分。我的问题列举如下:
问题1。代码在Insert()
函数中创建类型为Node的全局结构指针头
,以及指向结构节点
的本地指针。第一个箭头指向执行temp->next=head
的代码。这是否意味着我们要在temp->next中传递head的地址或head中的值?我猜这个值--请确认
假设我有一个案例:
int a= 2;
int *p;
然后p=&a代码>
意思是p
的地址是a
,但在这里,在code中似乎是p=a
,即指针temp->next=head
这里的next pointer=head
表示我们正在head节点内部传递值。如果是地址,我们应该使用&head
问题2。在下一个箭头中head=temp
。我清楚地看到我们正在把临时工的地址传给head?对吗?或者说是临时工的地址对临时工的地址
#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;
}
#包括
#包括
结构节点{
int数据;
结构节点*下一步;
};
结构节点*头部;
空白插入(整数x)
{
结构节点*temp=(结构节点*)malloc(sizeof(结构节点));
温度->数据=x;
温度->下一步=头部;下一步;
}
printf(“\n”);
}
int main()
{
head=NULL;
int n,i,x;
printf(“多少个数字?:\n”);
scanf(“%d”和“&n”);
对于(i=0;i您的第一个问题:
您声明了一个名为head的指针:
struct Node* head;
指针是指向内存中某个值的地址。
当您这样做时:
temp->next = head;
然后将指针head分配给temp->next。因此,指向该值的不是head的值,而是地址
你的第二个问题:
首先声明指针临时值,并为其分配一些内存:
struct Node* temp = malloc(sizeof(struct Node));
然后将其分配给head(head指针现在指向临时分配的内存):
这两个都是指针,因此您可以将临时指针保存在头指针中。仅此而已。例如:
假设你的头指针指向地址0001。你的临时指针指向地址0002。如果你这样做头=临时,那么头将指向地址0002
例如:
struct Node node1;
node1不是指针,因此它具有值。如果要从值中生成指针,则需要获取node1的地址:
struct Node *node1Pointer = &node1;
&node1表示节点1的地址
如果现在需要节点1的值,并从节点1指针中获取该值,则必须取消对该值的引用:
struct Node node2 = *node1Pointer;
*nodePointer的意思是,给我这个指针指向的值
现在,假设节点1的指针node1Pointer为地址0001,而另一个节点node2的指针node2Pointer指向地址0002
考虑以下几点:
struct Node *tempNodePointer = node2Pointer;
tempnodepeninter指向地址0002的点
node2Pointer = node1Pointer;
节点2指针现在指向地址0001
node1Pointer = 0;
node1Pointer = &nodeValue;
node1Pointer现在指向空,空指针
struct Node nodeValue = *node2Pointer;
nodeValue现在具有存储在地址0001处的值
node1Pointer = 0;
node1Pointer = &nodeValue;
节点1指针现在指向地址0001
node1Pointer = 0;
node1Pointer = &nodeValue;
这可能会澄清一点
我希望它能帮助您。您的代码有很多错误。在使用链表时,您需要一个开始指针来存储列表中第一个节点的地址,否则您将无法访问该列表。当您不断向列表中添加节点时,头节点将遍历到最后一个节点,并且不能将其作为您的开始节点e、 您的问题的答案已经由@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:temp
的地址是&temp
,temp
的值是malloc
head=temp
的返回值:temp
的值设置为head
的值。您能解释一下答案的最后一行吗这两个都是指针,所以您将temp指针保存在head指针中。除此之外代码>那么这是否意味着现在我们在临时指针中拥有的所有东西都被复制到了head?那么分配的临时指针到哪里去了?不,你只复制地址。这就像说head获得了一个新地址。但我将尝试用一个例子来澄清它。但是i you first answer temp->next也是指向结构节点的指针?我们不是在复制head吗指针指向temp->next?@Noobsplzdon't-1这能澄清你的疑问吗?@fonZ不要一直添加这种回溯。这是有害的。