在链表的开始插入节点



此程序基于链表。每次在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;意味着pa的地址但这里的代码看起来像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;
    }
}

相关内容

  • 没有找到相关文章

最新更新