此程序基于链表。每次在main()
中调用Insert(x)
时,它都会在列表的开头添加元素。代码中的大箭头指向我不确定是否正确的部分。我的问题列举如下:
问题1。代码在Insert()
函数中创建了一个Node类型的global structure pointer head
和一个指向结构体Node
的本地指针。第一个箭头指向执行temp->next = head
的代码。这是否意味着我们将在temp->next中传递head的地址或head内部的值?我猜值——请确认。
假设我有case:
int a= 2;
int *p;
然后p= &a;
意味着p
有a
的地址但这里的代码看起来像p=a
,即指针temp->next = head
这里的next pointer= head
意味着我们正在传递头部节点内部的值。如果它是地址,我们应该使用&head
?
问题2。在下一个箭头head = temp
。我清楚地看到我们正在将temp的地址传递给head?对吗?还是说从temp的地址到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;
}
你的第一个问题:
声明了一个名为head的指针:
struct Node* head;
指针是指向内存中某个值的地址。当你这样做的时候:
temp->next = head;
然后将指针头赋值给temp->next。所以它不是head的值,而是指向该值的地址。
第二个问题:
首先声明一个指针temp,然后为它分配一些内存:
struct Node* temp = malloc(sizeof(struct Node));
然后你把它赋值给头(头指针现在指向临时分配的内存):
head= temp;
都是指针,所以要将temp指针保存在头指针中。仅此而已。例如:假设你的头指针指向地址0001。你的temp指针指向地址0002。如果你设置head = temp,那么head将指向地址0002。
的例子:
struct Node node1;
node1不是指针,所以它有这个值。如果你想用这个值做一个指针,那么你需要取node1的地址:
struct Node *node1Pointer = &node1;
, node1 ,在地址node1 。
如果现在你想要node1的值,并从node1Pointer中得到它,那么你必须取消引用它:
struct Node node2 = *node1Pointer;
*nodePointer的意思是,给我这个指针指向的值。
现在让我们假设您有一个node1,它有一个地址为0001的指针node1Pointer。你有另一个节点,node2,它有一个node2Pointer指向地址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
这可能会更清楚一点。
你的代码有很多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;
}
}