链表C ++,问题自学

时间:2011-04-16 20:33:57

标签: c++ linked-list self

        #include <iostream>
    using namespace std;



    struct Node
    {
        int item;   // storage for the node's item
        Node* next;   // pointer to the next node 
    };

  Node* addNode(Node*& head, int data , int& count) 
{
    Node * q;     // new node
    q = new Node;  // allocate memory for the new mode
    q->item = data;  // inserting data for the new node
    q->next = head;   // point to previous node ?? how would i do that? ( am i doing it correctly?)
    count++; // keep track of number of node
    head = q;
    return q;
}



    int main()
    {
        int a, count=0;
        int data;
        bool repeat;
        Node *head= NULL;   
        //^^ assuming thats creating the first node ^^
        do
        {
        cout << "please enter the data for the next node" <<endl;
        cin >> data;
        addNode(head, data, count);
        cout << "do you wish to enter another node? (enter true or false)" << endl;
        cin >>repeat;
        }
       while (repeat == true);


       // assuming this is the print function  
          while(head != NULL)
        {
            cout << "output" << temp->item << endl;
            cout << temp->next << endl;
        }

        system("pause");
        return 0; 
    }

okey我尝试在列表中添加一个新元素如何像LIFO内存(堆栈)一样移动头部,以便最后一个元素位于最顶层..

任何帮助将不胜感激!指针和节点最近搞砸了我的大脑......

4 个答案:

答案 0 :(得分:1)

temp是一个未初始化的指针。所以 -

temp-> item = a;  // temp is not initialized or pointing to a memory location
                  // that has Node object to use operator ->

首先,temp需要使用new分配内存位置。

temp = new Node;
temp -> item = a;

现在分配head。同样,在while循环中也为子节点分配内存。并且在程序终止之前使用delete返回从子到头获取的所有资源。

答案 1 :(得分:1)

你似乎有一些误解:

你的“头”是列表的开头。它始终是一个开始。

添加通过将元素分配给最后一个节点的next指针将元素附加到链表。

第三,你没有分配任何东西。

Node *head= new Node();   
Node *temp = new Node();
cout<<"enter something into data"<<endl;
cin >> a ;
temp->item = a;
head->next = temp;

现在......要添加下一个内容,您需要跟踪最后一个节点(尾部),或者遍历列表以查找最后一个节点。

Node *nextNode = new Node();
nextNode->item = 0.0;
Node *i;
for (i = head; i->next != null; i = i->next);
i->next = nextNode;

这是O(n)执行时间。通过跟踪尾部,你可以得到O(1):

Node *head= new Node();
Node *tail = head;   
Node *temp = new Node();
cout<<"enter something into data"<<endl;
cin >> a ;
temp->item = a;
tail->next = temp;
tail = temp;

Node *nextNode = new Node();
nextNode->item = 0.0;
tail->next = nextNode;
tail = nextNode;

编辑:正如所指出的,如果您想要在列表前添加,您会:

temp->next = head;
head = temp;

答案 2 :(得分:0)

另请注意,您正在进行从intfloat的隐式演员

temp-> item = a;

aint,而temp->itemdouble

解决您的问题:您希望在访问temp之前分配新结构,因此

temp = new Node();

答案 3 :(得分:0)

由于我不确定每个答案是否完全回答它,这里是一个链表实现(没有testig编写:

// your (correct) structure
struct Node
{
    float item;   // storage for the node's item
    Node* next;   // pointer to the next node 
};

现在我们需要两个指针来管理列表:

/* some pointers */
struct List
{
    Node* head;
    Node* tail;
};

现在我们需要创建一些元素。正如其他人所说,你可以用新的方式做到这一点:

/* create some elements we want to link in */
Node* elem1 = new Node();
Node* elem2 = new Node();
Node* elem3 = new Node();
/* maybe even set their properties! */
elem1->item = 3.14;
elem2->item = 3.14;
elem3->item = 3.14;

请注意我没有尝试将这些元素添加到列表中?那是因为我有一个看起来像这样的功能:

void addtolist(List &list, Node* node)
{
    /* if no head, initialise the list */
    if ( list->head == NULL )
    {
        list->head = node;
        list->tail = node;
    }
    else if ( list->head != NULL && list->tail != NULL )
    {
        /* access the tail element and set its 
           next to this ptr. 
           Move tail to this node */
        list->tail->next = node;
        list->tail = node;
    }
    else
    {
        /* probably raise an exception! */
    }
}

你可以这样做:

List l;
addtolist(l, elem1); /* etc */

删除元素有点棘手,因为你必须转到那个元素,记住它的前一个元素,抓住它的下一个元素,加入它们并删除你所在的Node *。

现在遍历列表......你的术语HEAD|TAIL让我想起了Erlang和尾递归,其中当前元素被称为头部而余部分被称为尾部。如果我写:

Node* cur = l.head;
while ( cur != NULL )
{
    // do something with cur.item ? 
    cur = cur->next;
}

你可以看到这种情况发生。由于cur结构,将此head替换为List将无害。

最后,我在这里使用了类似C的方法,但是有模板的范围:

template<typename T>
struct node
{
    T item;   // storage for the node's item
    Node<T>* next;   // pointer to the next node 
};

并将List结构封装为类:

template<typename T>
class List
{
protected:
    Node<T>* head;
    Node<T>* tail;
public:

    void addtolist(Node<T>* node);
    Node<T>* gethead();
    Node<T>* gettail();
}

这让你更接近std::list