注册 登录
编程论坛 C++教室

链表错误 求大神指点

宋立鹏 发布于 2014-03-29 22:16, 462 次点击
程序代码:
//节点类定义
#ifndef NODE_H_
#define NODE_H_

#include <iostream>
#include <cstdlib>

template<typename T> class LinkList;
template<typename T>
class Node
{
public:
    friend class LinkList<T>;
public:
    T value;
    Node<T>* next;
public:
    //Node(NULL):next(NULL){NULL;};
    Node(){next=NULL;}
    Node(const T& T1){value=T1,next=NULL;};
    T& GetValue(void){return value;}
    Node<T>* GetNext(){return next;}

};
#endif

//链表类定义
#include <iostream>
#include "Node.h"
using namespace std;

template <typename T>
class LinkList
{
private:
    Node<T>* p_Head;
public:
    LinkList(void);
    ~LinkList(void);
    void clear(void);
    T& visit(size_t pos);
    void Insert(const size_t pos,const T& value);
    void add(const T& value);
    size_t getLengh(void) const;
    void remove(const size_t pos);
    size_t search(const T& value0) const;


};

template <typename T>
LinkList<T>::LinkList(void)
{
    p_Head=new Node<T>();
}
template <typename T>
LinkList<T>::~LinkList(void)
{
    clear();
    delete p_Head;
}
template <typename T>
void LinkList<T>::clear()
{
    while(!p_Head->next)
    {
        p_Head=p_Head->next;
        delete p_Head->next;
    }

      
}
template <typename T>
T&  LinkList<T>::visit(size_t pos)
{
    Node<T>* prev=p_Head;
    for(int i=0;i<pos+1&&prev!=NULL;i++)
    {
        prev=prev->next;
    }
    return prev->value;
}
template <typename T>
void LinkList<T>::Insert(const size_t pos, const T &value)
{
    Node<T>* prev=p_Head;
    Node<T>* newlist=new Node<T>(value);
    for(int j=0;j<pos&&prev!=NULL;j++)
    {
        prev=prev->next;
    }
    prev->next=newlist->next;
    newlist->next=prev->next->next;
   

}
template <typename T>
void LinkList<T>::add(const T &value)
{
   
    Node<T>* prev=p_Head;
   
    while(prev!=NULL)
    {
        prev=prev->next;
    }
   
    Node<T>* newlist=new Node<T>(value);   
    newlist->next=prev->next;   //出现错误的地方,不知道为什么
    prev->next=newlist;


}
template <typename T>
size_t LinkList<T>::getLengh() const
{
    int i=0;
    Node<T>* prev=p_Head;
    while(prev->next!=NULL)
    {
        prev=prev->next;
        i++;
    }
    return i;

}
template <typename T>
void LinkList<T>::remove(const size_t pos)
{
    Node<T>* prev=p_Head;
    for(int i=0;i<pos&&prev!=NULL;i++)
    {
        prev=prev->next;
    }
    Node<T>* savelist=prev->next;
    prev->next=prev->next->next;
    delete savelist;

}
template <typename T>
size_t LinkList<T>::search(const T &value0) const
{
    Node<T>* prev=p_Head;
    int i=0;
    while(prev->value!=value0)
    {
        prev=prev->next;
        i++;
    }
    return i;

}
//主函数
#include "LinkList.h"
#include <iostream>
using namespace std;

void main()
{
    //cout<<"nihao"<<endl;
    int num=10;
LinkList<int> link;
link.add(1);
link.add(2);
link.add(3);
link.add(5);
link.add(100);
cout<<link.getLengh()<<endl;



}

错误在add函数里  已经标明错误之处




1 回复
#2
yuccn2014-03-30 13:33
void LinkList<T>::add(const T &value)
{
   
    Node<T>* prev=p_Head;
   
    while(prev!=NULL)
    {
        prev=prev->next;
    }

   
    Node<T>* newlist=new Node<T>(value);   
    newlist->next=prev->next;   //出现错误的地方,不知道为什么
    prev->next=newlist;


}

你看红色的代码?推出循环的时候,prev 就等于null了。你出错的那句:newlist->next=prev->next;

你访问null的next?!直接崩溃

改成这样吧
    while(prev->next!=NULL)
    {
        prev=prev->next;
    }
   
    Node<T>* newlist=new Node<T>(value);   
    newlist->next = null;
    prev->next=newlist;
1