如何在链表C ++中动态创建新节点

时间:2015-01-02 02:04:04

标签: c++ data-structures linked-list nodes

有人能告诉我这是否是链接列表的基本概念?在C ++中实现链接列表时,此方法的优缺点是什么?最佳实践是什么?我是数据结构的新手,所以这是我的第一个方法。如果有更好的方法来做同样的事情,请告诉我。另外,如何在不进行硬编码的情况下动态创建节点?谢谢。

#include <iostream>
#include <string>

using namespace std;
struct node {
    int x;
    node *next;
};

int main()
{

    node *head;
    node *traverser;


    node *n = new node;                 // Create first node
    node *t = new node;                 // create second node

    head =n;                            //set head  node as the first node in out list.
    traverser = head;                   //we will first begin at the head node.

    n->x = 12;                          //set date  of first node.
    n->next = t;                        // Create a link to the next node

    t->x = 35;                          //define date  of second node.

    t->next = 0;                        //set pointer to null if this is the last node in the list.


    if ( traverser != 0 ) {                 //Makes sure there is a place to start
        while ( traverser->next != 0 ) {
            cout<< traverser->x;            //print out first data member
            traverser = traverser->next;    //move to next node
            cout<< traverser->x;            //print out second data member

        }
    }
    traverser->next = new node;  // Creates a node at the end of the list
    traverser = traverser->next; // Points to that node
    traverser->next = 0;         // Prevents it from going any further
    traverser->x = 42;
}

4 个答案:

答案 0 :(得分:0)

我更喜欢制作链表类。这消除了不止一次调用'new'的需要。可以找到一个带有示例的很好的实现here

答案 1 :(得分:0)

您实际上已经在进行动态分配了。所以,不确定你要求的是什么。但是,如果要定义函数以将新节点添加到链接列表(或删除节点等),这可能是一个可能的解决方案:

插入/删除位置节点取决于数据结构的类型。在队列中,新节点将被添加到结尾;在堆栈的情况下在顶部。将节点添加到顶部的功能,模拟STACK推送操作:

void pushNode(node **head, int Value) {  
  node *newNode = new node;  
  newNode->x = Value;  
  newNode->next = *head;  
  *head = newNode;  
}  

它会被称为pushNode(&head, 15),其中&#39; head&#39;将被定义为node *head = NULL。根head最初应设置为NULL。在此操作之后,head将指向新添加的节点(堆栈顶部)。

这种方法对于其他数据结构(即队列)非常相似,并且工作正常。但是当你使用C ++时,我建议为你的链表定义一个类,并将这些函数定义为方法。这样,它将更方便,更不容易出错。

更好地使用std::list。它是标准的东西,比定制实现更具可移植性和强大性。

答案 2 :(得分:0)

出于教学目的,您可以计算出这个例子:

#include <iostream>

using namespace std;

struct myList
{
    int info;
    myList* next;
};

int main()
{
    //Creation part
    myList *start, *ptr;
    char ch = 'y';
    int number;
    start = new myList;
    ptr = start;
    while (ptr != NULL)
    {
        cout << "Enter no. ";
        cin >> ptr->info;
        cout << "Continue (y/n)? ";
        cin >> ch;
        if (ch == 'y')
        {
            ptr->next = new myList;
            ptr = ptr->next;
        }
        else
        {
            ptr->next = NULL;
            ptr = NULL;
        }
    }

    //Traversal part begins
    cout << "Let's start the list traversal!\n\n";
    ptr = start;
    while (ptr!=NULL)
    {
        cout << ptr->info << '\n';
        ptr = ptr->next;
    }
}

它为您想要添加的元素动态分配内存。

答案 3 :(得分:0)

您也可以通过这种方式完成

#include <iostream>
using namespace std;

struct Node{
   int data;
   Node* next;
};

void createList(Node** head ,Node* temp){
int n;
char ch;
temp = *head;
while(temp != NULL){
    cout<<"Enter The Value  ";
    cin>>temp->data;
    cout<<"DO you want to continue(y/n)";
    cin>>ch;
    if(ch=='Y' || ch == 'y'){
        temp->next = new Node;
        temp = temp->next;
    }else{
        temp->next = NULL;
        temp = NULL;
    }
  }
}

void ShowList(Node* head){
    cout<<"your list :"<<endl;
    while(head != NULL){
    cout<<head->data<<" ";
    head = head->next;
}
}

int main()
{   
   //Creation part
   Node *head, *temp;
   createList(&head,temp);
   ShowList(head);

 }