结构,链表,删除整个列表

时间:2015-06-09 21:25:40

标签: c++ struct linked-list

如何从结构中实现的链表中删除所有对象?在我的删除功能(loeschen)显示漫画编号后,我不再知道我的指针在哪里。

struct domino {
int data1;
int data2;
domino *next;


};

int readSteine (){ //Reading from numbers from file
    FILE *file;


    if((file=fopen("datei.dat", "r") )==NULL) { /
        std::cout<<"File cant be open"<<std::endl;
        return 0;
    }else {
        int beginning;
        int temp;
        fscanf(file, "%d", &beginning);

        for(int i=0; i<beginning; i++) {
            domino *domino1= new domino;
             //if(i>0) temp2->next=domino1; 
            fscanf(file, "%i", &temp);
            domino1->data1=temp;
            fscanf(file, "%i", &temp);
            domino1->data2=temp;
            printf("[%d:%d]", domino1->data1, domino1->data2);
            domino1->next=0;
       }
    }return 0;
}

删除列表的功能:

void deletelist (domino *head) {
    domino* tmp;
    while(head != 0) { 
        tmp=head->next;
        delete head;
        head=tmp;
    }

}


int main() {
    domino *pHead=NULL; 
domino s;
    readSteine();
    deletelist(pHead);
    std::cout<<s.data1<<"...."<<s.data2<<std::endl;

    return 0;
}

3 个答案:

答案 0 :(得分:1)

以下是一个明确方法的示例。我们的想法是遍历列表并逐个删除节点。

Node *pDel = _pHead;

    /* Traverse the list and delete the node one by one from the head */
    while (pDel != NULL) {
        /* take out the head node */
        _pHead = _pHead->_pNext;
        delete pDel;
        /* update the head node */
        pDel = _pHead;
    }
    /* Reset the head and tail node */
    _pTail = _pHead = NULL;

答案 1 :(得分:-1)

定义函数,如

    @XmlElement(name = "Date", required = true)
    @XmlSchemaType(name = "date")
    protected XMLGregorianCalendar date;

并将其称为

void loeschen (dominostein **kopf) {
    dominostein* tmp;
    while(*kopf != 0) { //bzw. NULL
        tmp = ( *kopf )->next;
        delete *kopf;
        *kopf = tmp;
    }
}

或以下方式

loeschen(&pKopf);

并将其称为

void loeschen (dominostein * &kopf) {
    dominostein* tmp;
    while( kopf != 0) { //bzw. NULL
        tmp = ( kopf )->next;
        delete kopf;
        kopf = tmp;
    }
}

您的原始功能也正确但删除了所有节点后

loeschen(pKopf);

您应该将loeschen(pKopf); 设置为NULL

pKopf

或者您根本不应该使用此指针来访问已删除的节点。:)

考虑到这个陈述

pKopf = NULL;

没有意义,因为在创建对象时,对象std::cout<<s.data1<<"...."<<s.data2<<std::endl; 的数据成员data1data2没有被广泛化

s

此对象与列表没有任何共同之处。

函数domino s; 不使用main

中定义的节点readSteine
pHead

你shpuld重写了这个功能。这是错误的。

答案 2 :(得分:-1)

你的loeschen永远不会工作,因为你传递给它只是一个NULL。 首先需要正确构建列表。首先,你需要将你的Kopf(一种对它的引用)传递给readSteine函数,然后将它分配给每个新的下一个,然后为它分配新的多米诺骨牌,依此类推以形成链表。 / p>

我强烈建议您阅读Programming: Principles and Practice Using C++

您将C函数和编程风格与C ++混合在一起。你甚至不需要知道这些C函数,这些函数很难学习,以便开始学习C ++。