project.exe已触发断点

时间:2014-04-01 10:28:47

标签: c++ list visual-c++ linked-list circular-list

我有一个循环链接列表,其中包含添加,删除,打印列表和搜索功能等。所有功能都正常工作但是当我删除列表中的所有节点而不是尝试将新节点添加到同一列表中时,我得到了项目.exe已触发断点消息。

List.h

#ifndef LIST_H
#define LIST_H

using namespace std;

class list {
public:

    struct node {       
        string data, assignee, date;
        node *next;
    };

    typedef struct node NodePtr;

    NodePtr *head, *current, *temp, *dummy;

    list();
    void add();
    void del();
    void printList();
    void menu();
    void exit();
    void search();

};

#endif

Source.cpp

#include <cstdlib>
#include <iostream>
#include "List.h"
#include<string>

using namespace std;

list::list() {          //constructor
    head = NULL;
    current = NULL;
    temp = NULL;    
}
void list::add(){
    string addTask, addAssignee, addDate;
    NodePtr *newNode = new NodePtr;

    //entering the data of the tasks
    cout << "Enter the name of the task:\n"<<"<<";
    getline(cin, addTask);          // compailer doesnt detect the first getline   function, ı dont understan why. ı had to put it twice
    getline(cin, addTask);
    cout << "Enter the assignee name for the task:\n" << "<<";
    getline(cin, addAssignee);
    cout << "Enter the deadline for the task:\n" << "<<";
    getline(cin, addDate);
    cout << "\n";

    //assignt data to the new node
    newNode->data = addTask;
    newNode->assignee = addAssignee;
    newNode->date = addDate;
    newNode->next = NULL;

    if (head != NULL){

        current = head;

        while (current->next != head){          //finding the last node
            current = current->next;
        }
        current->next = newNode;
        dummy = newNode;
        dummy->next = head;             //  we make the list, circular
    }
    else               //here will work if the list is empty
    {
        head = newNode;
        dummy = newNode;
        head->next=head;
    }


}
void list::printList(){
    int i = 1;
    current = head;
    if (head == NULL){
        cout << "List is empty\n\n";
    }
    else
    {
        do
        {
            cout << i << "-";
            cout << current->data << endl;
            cout << current->assignee << endl;
            cout << current->date << endl << endl;
            current = current->next;
            i++;
        } while (current != dummy->next);
    }
}

void list::del(){                       //tüm liste silindikten sonra tekrar işlem(ekleme, listeleme etc.) yapılamıyor hata veriyor
    NodePtr *delPtr;
    delPtr = NULL;
    int ID;
    cout << "These tasks exist in the list:\n";
    printList();
    cout << "Choose the ID of the task you want to remove:\n";
    cin >> ID;
    if (head == NULL){
        cout << "List does not includes any task.\n";
    }
    else
    if (ID == 1){
        delPtr = head;
        head = head->next;
        delete delPtr;
        dummy->next = head;
    }
    else
    {
        current = head;

        for (int k = 1; k <= ID - 1; k++){
            temp = current;
            current = current->next;
        }
        if (current == dummy){
            dummy = temp;
            dummy->next = head;
        }
        delPtr = current;
        current = current->next;
        temp->next = current;

        delete delPtr;
    }
}
void list::menu(){

    cout << "Choose an operation\n"
        << "A: Add Task\n"
        << "S: Search for Task\n"
        << "L: List All Tasks\n"
        << "R: Remove Task\n"
        << "E: Exit\n\n"<<"<<";

}

void list::search(){
    string searchTask;
    NodePtr *search;
    search = head;

    cout << "To search for a task, enter its task name or assignee name:\n" << "<<";
    getline(cin, searchTask);
    getline(cin, searchTask);

    while (search != dummy){//bu satır problemli gibi gözüküyor

        if (search->data == searchTask || search->assignee == searchTask){
            cout << search->data << endl
                << search->assignee << endl
                << search->date << endl<<endl;
        }
        search = search->next;
    }

}

void list::exit(){
    node *delPtr;
    current = head;
    if (head != NULL){

        do{
            temp = current;
            delPtr = temp;
            current = current->next;

            delete delPtr;
        } while (current != dummy);
    }
}

Main.cpp的

#include <cstdlib>
#include <iostream>
#include "List.h"
#include<string>
using namespace std;

int main(){


    char operation;
    list tasks;
    tasks.menu();


    cin >> operation;

    while (operation!='E' && operation!='e'){

        switch (operation)
        {
        case 'A':case'a':
            tasks.add();
            break;
        case 'S': case's':
            tasks.search();
            break;
        case 'L': case 'l': 
            cout << "All tasks are listed below:\n";
            tasks.printList();
            break;
        case 'R': case 'r':
            tasks.del();
            break;
        default:
            break;
        }
        tasks.menu();
        cin >> operation;



    }

    tasks.exit();
    return 0;
}

0 个答案:

没有答案