【问题标题】:Struct, linked list,delete the whole liststruct,链表,删除整个链表
【发布时间】:2015-06-09 21:25:39
【问题描述】:

如何从链表中删除所有对象,在结构中实现?在我的删除功能(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;
}

【问题讨论】:

  • 嗨戴安娜。首先,您需要将您的 Kopf 传递给 readSteine 函数,并将其分配给每个新的 next,然后将新的多米诺骨牌分配给它,依此类推以形成链表..
  • @ACV 虽然它可以帮助我们更快地理解问题,但绝对不会帮助 OP 学习外语 C++。

标签: c++ struct linked-list


【解决方案1】:

以下是 clear 方法的示例。思路是遍历链表,逐个删除节点。

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;

【讨论】:

    【解决方案2】:

    像这样定义函数

    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);
    

    你应该将pKopf设置为NULL

    pKopf = NULL;
    

    或者你根本不应该使用这个指针来访问被删除的节点。:)

    考虑到这个声明

    std::cout<<s.data1<<"...."<<s.data2<<std::endl;
    

    没有意义,因为对象 s 的数据成员 data1data2 在创建对象时没有被初始化

    domino s;
    

    而且这个对象与列表没有任何共同之处。

    而函数readSteine不使用main中定义的节点pHead

    domino *pHead=NULL; 
    //...
    readSteine();
    

    你应该重写函数。错了。

    【讨论】:

      【解决方案3】:

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

      我强烈推荐你阅读Programming: Principles and Practice Using C++

      您将 C 函数和编程风格与 C++ 混合使用。你甚至不需要知道这些难学的C函数就可以开始学习C++。

      【讨论】:

      • 投反对票,因为这不是答案。应该是评论(即使需要几个 cmets 才能适应所有内容......)
      • @EvanCarslake 。你确定吗?这怎么不是正确答案?你读过Q吗?为什么什么都没有被删除?为什么漫画“-rare”输出?删除功能没问题。
      猜你喜欢
      • 2013-10-28
      • 1970-01-01
      • 2021-06-07
      • 2011-05-06
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多