简体   繁体   中英

Create and Display Linked List

I am a beginner in C++ and need help in many things. Well, for the starters, I have been working on Linked List and not really getting why my header(the first pointer which points towards first node) keep on rotating. I am just pointing it towards first node plus my display node is just displaying last node, why is it so?. Please tell me where I am wrong. Thank you in advance

#include <iostream>
#include <conio.h>

using namespace std;

struct Node
{
    int data;
    Node *link;
};
Node* create_Node()
    {
        int no_of_nodes;
        Node *header = new Node;
    Node *ptr = new Node;
    header = ptr;
    cout << "Enter no of nodes:";
    cin >> no_of_nodes;
    cout << "Enter data:";
    for(int n = 0; n < no_of_nodes; n++)
    {
        cin >> ptr->data;
        Node *temp = new Node;
        ptr->link = temp;
        temp = ptr;
    }
    ptr->link = NULL; 
  return ptr; 
}
void display_link_list(Node * list)
{
    Node *temp = new Node;
    temp = list;
           while(temp != NULL)
{
        if(temp->link != NULL)
    {
        cout << "List:" << list->data << endl;
                temp = temp->link;
    }
}
}
int main()
{
    Node *n = new Node;
    n = create_Node();
    display_link_list(n);
    getch();
    return 0;
}

Welcome to C++. My advice here is to break the Linked list into two. First the Nodes and then a List struct.

struct Node
{
    int data;
    Node *next;
    Node(int data) : data(data), next(NULL) {}
};

struct List {
    Node* tail;
    Node* head;
    List() : head(NULL), tail(NULL) {}
    void insert(int data) {
        if(head==NULL) {
            head = new Node(data);
            tail = head;
        } else {
            tail->next = new Node(data);
            tail = tail->next;
        }
    }
};

Now you can insert one element into the list at a time and use head to print the list from beginning to end.

Something basic that you need to understand:

When you do Node* p = new Node , you are setting variable p to point to the start address of a piece of memory, the size of which being equal to sizeof(Node) .

Now, when you then do p = something else (which often appears in your code), you are essentially overriding the previous value of p with some other value. It is like doing:

int i = 5;
i = 6;

So your code does not do what you're expecting to begin with.

In addition to that, what's bad about overriding the first value with a second value in this case, is the fact that the first value is the address of a dynamically-allocated piece of memory, that you will need to delete at a later point in your program. And once you've used p to store a different value, you no longer "remember" that address, hence you cannot delete that piece of memory.

So you should start by fixing this problem in each of the following places:

Node *header = new Node; // Variable 'header' is assigned
header = ptr;            // Variable 'header' is reassigned

Node *temp = new Node;   // Variable 'temp' is assigned
temp = list;             // Variable 'temp' is reassigned

Node *n = new Node;      // Variable 'n' is assigned
n = create_Node();       // Variable 'n' is reassigned

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM