在链表的开头插入节点

时间:2014-08-06 13:36:46

标签: c pointers linked-list

此程序基于链接列表。每次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;
}

3 个答案:

答案 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