使用代码块将节点插入链表的开头

时间:2018-08-25 11:07:36

标签: c++

当我在链接列表的开头插入节点时,节点会插入到开头并显示。如果我单独调用display,那么它将无法正常工作,并且如果要在特定位置和最后插入节点,则调用display函数会很好。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef struct node {
    int data;
    struct node* next;
} node;

node* create(int n)
{
    node* temp = NULL;
    node* head = NULL;
    node* p;
    int i;
    for (i = 0; i < n; i++) {
        temp = (node*)malloc(sizeof(node));
        cout << "enter the data for node number " << i << endl;
        cin >> temp->data;
        temp->next = NULL;
        if (head == NULL) {
            head = temp;
        }
        else {
            p = head;
            while (p->next != NULL) {
                p = p->next;
            }
            p->next = temp;
        }
    }
    return head;
}

node* insertatbeg(node* head)
{
    node* temp = NULL;
    temp = (node*)malloc(sizeof(node));
    cout << "\nenter the data for first node" << endl;
    cin >> temp->data;
    temp->next = head;
    head = temp;
    return head;
}

void display(node* head)
{
    node* t = NULL;
    t = head;
    while (t != NULL) {
        cout << t->data << "->";
        t = t->next;
    }
}

node* insertatspecloc(node* head)
{
    int n;
    node* temp = NULL;
    node* t = head;
    temp = (node*)malloc(sizeof(node));
    cout << "enter the data of node after which you want to insert the 
            node "<<endl;
            cin
        >> n;
    cout << "\nenter the data for last node" << endl;
    cin >> temp->data;
    while (t->data != n) {
        t = t->next;
    }
    temp->next = t->next;
    t->next = temp;
    return head;
}

node* insertatend(node* head)
{
    node* temp = NULL;
    temp = (node*)malloc(sizeof(node));
    cout << "\nenter the data for last node" << endl;
    cin >> temp->data;
    temp->next = NULL;
    node* q;
    q = head;
    while (q->next != NULL) {
        q = q->next;
    }
    q->next = temp;
    return head;
}

int main()
{
    int n, a;
    struct node* head = NULL;
    cout << "enter the number of nodes u want to add";
    cin >> n;
    head = create(n);
    display(head);
    cout << "\npress 1 to add node at the beginning";
    cout << "\npress 2 to add node at the specific location";
    cout << "\npress 3 to add node at the end\n";
    cin >> a;
    if (a == 1) {
        insertatbeg(head);
        cout << "\nlinked list after insertion:\n";
        display(head);
    }
    if (a == 2) {
        insertatspecloc(head);
        cout << "\nlinked list after insertion:\n";
        display(head);
    }

    if (a == 3) {
        insertatend(head);
        cout << "\nLinked list after insertion:\n";
        display(head);
    }
}

1 个答案:

答案 0 :(得分:0)

在调用insertatbeg(head);时,将head指针的副本作为函数的参数传递,然后在函数中修改局部变量( head 的副本)

 node *insertatbeg(node *head)
{
   node *temp=NULL;
   temp=(node*)malloc(sizeof(node));
   cout<<"\nenter the data for first node"<<endl;
   cin>>temp->data;
   temp->next=head;
   head=temp; // assign to local variable <---
   return head;
        }

,因此执行 insertatbeg head后不会更新。 insertatbeg返回指针,因此您可以通过致电

解决问题
head = insertatbeg(head);

或者您可以在上面的行中调用函数而无需分配,但是您应该通过引用传递head,以便能够在函数中修改原始传递的对象:

 node *insertatbeg(node *& head) // pass pointer by reference
{
   node *temp=NULL;
   //...
   head = temp; // now it works
相关问题