代码之家  ›  专栏  ›  技术社区  ›  Maestro1024

添加或遍历链表时出现问题

  •  1
  • Maestro1024  · 技术社区  · 14 年前

    我在添加或遍历链表时遇到问题。主项类被另一个类使用,但是我可以添加正确的数量,但是当我向列表中添加更多数据时,应用程序似乎不再工作。

    我不确定错误到底在哪里。我知道当我尝试遍历列表时,应用程序会崩溃。任何想法或任何改进都将不胜感激。

    通过将addoccurrence方法更改为不执行while循环,可以使崩溃不发生。

    void Item::AddOccurence(int Item,int placeInLine){
        ItemOccurence* ocr=myHead;
        if(ocr)
        {
    
        }
    

    而不是

    void Item::AddOccurence(int Item,int placeInLine){
        ItemOccurence* ocr=myHead;
        while(ocr)
        {
    
        }
    

    我有一个包含列表的对象。 这是.h文件 #包括

    class ItemOccurence{
    public:
        ItemOccurence(int line,int placeInLine,ItemOccurence* link=NULL) :myLine(line),myPlaceInLine(placeInLine),myLink(link){}
    
        int myLine;
        int myPlaceInLine;
        ItemOccurence* myLink;
    };
    
    class Item {
    public:
        Item();
        Item(string Item,int line,int placeInLine);
        virtual ~Item();
        void deallocate(ItemOccurence* p);
        void AddOccurence(int Item,int placeInLine);
        string myItem;
        ItemOccurence* myHead;
    private:
        bool isEmpty();
    };
    

    以及.cpp文件

    #include "Item.h"
    #include <string>
    #include<iostream>
    using namespace std;
    Item::Item(string Item,int line,int placeInLine):myHead(NULL){
        myItem=Item; 
    
        myHead= new ItemOccurence(line,placeInLine,NULL);
    }
    
    Item::Item():myHead(NULL){
    myHead=0;
    }
    
    Item::~Item() {
        deallocate(myHead);
        myHead=0;
    }
    
    void Item::deallocate(ItemOccurence* p){
        ItemOccurence* tmp;
        while(p){
            tmp=p;
            p=p->myLink;
            delete tmp;
        }
    }
    
    void Item::AddOccurence(int Item,int placeInLine){
        ItemOccurence* ocr=myHead;
        while(ocr)
        {
              cout<<"orrucence head while adding " << myHead->myLine << " " << myHead->myPlaceInLine <<"\n";
            ocr=ocr->myLink;
        }
    
        myHead = new ItemOccurence(Item,placeInLine,myHead);
    
        return;
    }
    
    bool Item::isEmpty(){
        if(myHead)
            return false;
        else
            return true;
    }
    

    编辑:

    void Item::AddOccurence(int line,int placeInLine){
        ItemOccurence* prev = myHead;
        ItemOccurence* curr = myHead->myLink;
    
        while(curr){
            prev=curr;
            curr=curr->myLink;
            }
    
        // insert new ItemOccurence
        cout<<"adding " <<line<< " and " << placeInLine <<"\n";
        prev->myLink = new ItemOccurence(line,placeInLine); 
    
        return;
    }
    

    但我还在崩溃。我试着调试,但不知道要找什么。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Stephen    14 年前

    很难判断你的代码要做什么。不幸的是,事实是,它离“工作”还很远。

    以下是一些提示:

    • 重新考虑你的课程。是什么 Item ItemOccurrence ? 链表是一个列表。它有物品。你应该给它起个名字 List 项目 项目 列表 项目
    • 每个 项目 string (节点数据)和 next
    • 如果你使用 列表 ,它将需要一个指向 head 项目 ).
    • 你呢 不要 需要存储 placeInLine . 位置内联 只能在搜索要插入新文件的位置时使用 项目 .
    • 不清楚是什么 ItemOccurrence::myLine 应该代表什么。
    • 初始化时 myHead(NULL) ,您不需要将其设置为 0 .
    • isEmpty() private 方法。
    • 添加节点的算法是:
      • 循环直到找到需要插入的位置。
      • new_node->next = current->next->next
      • current->next = new_node 节点。
      • current->next NULL
    • 而不是 if (x) return true; else return false; ,这是很常见的 return x;
        2
  •  0
  •   RickNotFred    14 年前

    代码有几个问题,但最明显的是addOccurrence方法在创建myHead之后没有设置myLink指针。我认为这就是您在上面的循环中试图做的,但实际上,代码似乎只在现有列表中循环并打印出来。您可能打算在placeInLine中循环多次,然后在该级别更新myLink指针。目前还不清楚item和placeInLine之间有什么区别,也不清楚为什么两者都需要。您肯定不想将类名(比如Item)用作整数变量。这增加了混乱。