从单个链接列表中按值删除

时间:2017-06-14 21:31:22

标签: c++

所以我一直试图过滤我的清单。列表已正确创建并填充,但我从文档中获得了两次条目。它应该是那样的。现在我试图将它们过滤掉,我想我对它有了很好的了解,但是它不能正常工作。

Anmeldung* delete_object(Anmeldung* b){

    Anmeldung* tmp = b;
    b = b->next;
    delete(tmp);

    return b;
}


void filter_list(Anmeldung* b){

    Anmeldung* tmp = b;

    while(b!=NULL){
        std::string info = b->Matrikelnummer;

        while(tmp!=NULL){

            if(tmp->Matrikelnummer == info){
                tmp = delete_object(tmp);
            }else
                tmp = tmp->next;
        }
        b = b->next;
        tmp = b;
    }
}

所以我试图遍历我的列表并将每个值与整个列表进行比较。我正在搜索的值是Matrikelnummer,如果两个人得到相同的Matrikelnummer,则会被删除。

这是我的结构Anmeldung。这是我的教授提供的:

struct Anmeldung {
  Anmeldung* next;
  std::string   Nachname;             // Name Teilnehmer
  std::string   Vorname;              // Vorname Teilnehmer
  std::string   Email;                // Email Adresse Teilnehmer
  std::string   Matrikelnummer;       // Matrikelnr. Teilnehmer
  std::string   Studienrichtung;      // Studienrichtung Teilnehmer
  std::string   Semester;             // Studiensemester Teilnehmer
  std::string   G1name;               // Name Wunschkandidat fuer Praktikumsgruppe
  std::string   G1vorname;            // Vorname Wunschkandidat
  std::string   Anmerkung;            // Freier Text
};

我认为while循环是正确的,delete_object是错误的,但我看不到在哪里或如何。 我不被允许使用容器列表或类似的东西。我只有结构。所以没有双重链表。

2 个答案:

答案 0 :(得分:0)

当您致电<?php namespace App\Command; use App\Entity\Foo; use App\Entity\Bar; use Doctrine\Common\Persistence\ManagerRegistry; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class RegenerateSlugs extends Command { private $doctrine; public function __construct(ManagerRegistry $doctrine) { parent::__construct(); $this->doctrine = $doctrine; } protected function configure(): void { $this ->setName('app:regenerate-slugs') ->setDescription('Regenerate the slugs for all Foo and Bar entities.') ; } protected function execute(InputInterface $input, OutputInterface $output): void { $manager = $this->doctrine->getManager(); // Change the next line by your classes foreach ([Foo::class, Bar::class] as $class) { foreach ($manager->getRepository($class)->findAll() as $entity) { $entity->setSlug(null); //$entity->slug = null; // If you use public properties } $manager->flush(); $manager->clear(); $output->writeln("Slugs of \"$class\" updated."); } } } 时,您不会删除正在传递的对象,而是删除链接列表中的 next 条目。因此,您的delete_object()语句正在找到要删除的正确节点,但之后您将继续之后删除节点。你应该解决这个问题(但是要保留在删除节点之后返回节点的一般想法。)

此外,您的无条件if()逻辑会导致跳过 tmp = tmp->next返回的节点(如果已调用)。您应该将该语句放在delete_object()子句中,因为一旦修复else,它将返回您想要继续的下一个节点。

答案 1 :(得分:0)

尚未查看详细信息,但在filter_list Anmeldung* tmp = b;中有if(tmp->Matrikelnummer == info){,这意味着strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\default") Set objItem = objWMIService.Get("SystemRestore") errResults = objItem.Enable("D:\") 'Inform User that the task is done. Mybox = MsgBox("System Restore is now enabled on "& strComputer &"" & vbCRLF ,vbOkOnly,"System Restore Enabled") 始终为真。