C++ C++;使用“插入”和“删除”修改链接列表

C++ C++;使用“插入”和“删除”修改链接列表,c++,function,insert,linked-list,C++,Function,Insert,Linked List,我需要获取第一个链表,并使用insert和remove函数将其转换为第二个被注释的链表。我一辈子都不知道该怎么做,因为我不知道如何多次使用remove函数或insert函数 编辑:我更新了代码,插入和删除了某些部分,程序在打印功能中遇到问题 #include <iostream> #include <string> using namespace std; struct Cafe { string item; int count; Caf

我需要获取第一个链表,并使用insert和remove函数将其转换为第二个被注释的链表。我一辈子都不知道该怎么做,因为我不知道如何多次使用remove函数或insert函数

编辑:我更新了代码,插入和删除了某些部分,程序在打印功能中遇到问题

#include <iostream>
#include <string>
using namespace std;

struct Cafe
    {
    string item;
    int count;
    Cafe *link;
    };

typedef Cafe* CafePtr; 

void head_insert(CafePtr& head, string i, int c);
CafePtr searchnum(CafePtr& head, int target);
CafePtr searchstr(CafePtr& head, string target); 
void insert (CafePtr after_me, string i, int c);//insert a node in the list
void print (CafePtr head);                      //print the list
void remove(CafePtr before, CafePtr discard);   //remove a node from the list

int main(){

    CafePtr head;
    CafePtr iter, h;

    head = new Cafe;
    head->link = NULL;

    head_insert(head, "QL", 3808);
    head_insert(head, "CHGHS", 1312);
    head_insert(head, "REI", 10466);
    head_insert(head, "CPT", 1678);
    head_insert(head, "NetApp", 6887);
    head_insert(head, "EJ", 36937);
    head_insert(head, "WFM", 41717);
    head_insert(head, "SAS", 6046);
    head_insert(head, "BCG", 1958);
    head_insert(head, "Google", 18500);

    print (head);

    CafePtr before = searchstr(head, "Google"); 
    CafePtr discard = searchstr(head, "BCG");
    remove(before, discard);

    before = searchstr(head, "Google");
    discard = searchstr(head, "SAS"); 
    remove(before, discard);

    CafePtr after_me = searchstr(head, "Google");
    insert(after_me, "SAS", 6373);

    after_me = searchstr(head, "SAS");
    insert(after_me, "CHGHS", 1378);

    before = searchstr(head, "CHGHS");
    discard = searchstr(head, "WFM"); 
    remove(before, discard);

    after_me = searchstr(head, "CHGHS");
    insert(after_me, "BCG", 2314);

    before = searchstr(head, "BCG");
    discard = searchstr(head, "EJ"); 
    remove(before, discard);

    after_me = searchstr(head, "BCG");
    insert(after_me, "WFM", 43927);

    before = searchstr(head, "WFM");
    discard = searchstr(head, "NetApp"); 
    remove(before, discard);

    after_me = searchstr(head, "WFM");
    insert(after_me, "NetApp", 7426);

    before = searchstr(head, "NetApp");
    discard = searchstr(head, "CPT"); 
    remove(before, discard);

    after_me = searchstr(head, "NetApp");
    insert(after_me, "Hilcorp", 1012);

    before = searchstr(head, "Hilcorp");
    discard = searchstr(head, "REI"); 
    remove(before, discard);

    after_me = searchstr(head, "Hilcorp");
    insert(after_me, "EJ", 35114);

    //before = searchstr(head, "EJ");
    //discard = searchstr(head, "CHGHS"); <- If this bunch gets uncommented, the program breaks.
    //remove(before, discard);

/*  after_me = searchstr(head, "EJ");
    insert(after_me, "Ultimate", 1440);

    after_me = searchstr(head, "CHGHS"); //These things just need to be added after, these are the two final additions to the list
    insert(after_me, "CPT", 1896);
    */


    cout << endl;
    print(head); //If i remove this from the program, and uncomment the problem lines above, the program runs fine.
    return 0;

}

void head_insert(CafePtr& head, string i, int c)
{
    CafePtr temp_ptr;
    temp_ptr = new Cafe;

    temp_ptr -> item = i;
    temp_ptr -> count = c;

    temp_ptr -> link = head;
    head = temp_ptr;

}

CafePtr searchnum(CafePtr& head, int target)
{
    CafePtr here = head;

    if(here == NULL)
    {
        return NULL;
    }
    else
    {
        while(here->count !=target && here->link != NULL)
            here = here->link;
        if(here->count == target)
            return here;
        else
            return NULL;
    }
}

CafePtr searchstr(CafePtr& head, string target)
{
    CafePtr here = head;

    if(here == NULL)
    {
        return NULL;
    }
    else
    {
        while(here->item !=target && here->link != NULL)
            here = here->link;
        if(here->item == target)
            return here;
        else
            return NULL;
    }
}

void insert (CafePtr after_me, string i, int c)
{
    CafePtr temp_ptr;
    temp_ptr = new Cafe;
    temp_ptr->item = i;
    temp_ptr->count = c;

    temp_ptr->link = after_me->link;
    after_me->link = temp_ptr;          
}


void print (CafePtr head)
{

    for (CafePtr iter = head; iter !=NULL; iter=iter->link)
    {
        cout << (iter->item) << "\t" << (iter->count) << endl; //This line is where the debugger encounters a problem
    }
}

void remove(CafePtr before, CafePtr discard)
{
    before->link = discard->link;
    delete discard;                 
}

// The second argument is not needed. before's link should be discard.
void remove(CafePtr before) // , CafePtr discard)
{
    CafePtr discard = before->link;
    // The guard. If before is the tail.
    if (discard != NULL)
        before->link = discard->link;
    // deletion on NULL has no effect so the above guard is unnecessary here.
    delete discard;
}
// This will just remove the current head from linked list but won't delete the object.
CafePtr remove_head(CafePtr& head)
{
    if (head == NULL) return NULL;
    CafePtr to_discard = head;
    head = to_discard->link;
    to_discard->link = nullptr;
    return to_discard;
}
#包括
#包括
使用名称空间std;
结构咖啡馆
{
字符串项;
整数计数;
咖啡馆*链接;
};
typedef Cafe*CafePtr;
空心封头插入件(套管头和封头、管柱i、内部c);
CafePtr searchnum(CafePtr&head,int-target);
CafePtr searchstr(CafePtr&head,字符串目标);
无效插入(大写字母后,字符串i,int c)//在列表中插入一个节点
无效打印(CafePtr头)//打印列表
无效清除(CafePtr前,CafePtr报废)//从列表中删除节点
int main(){
咖啡头;
CafePtr-iter,h;
head=新咖啡馆;
head->link=NULL;
封头插入件(封头,“QL”,3808);
封头插入件(封头,“CHGHS”,1312);
封头插入件(封头,“REI”,10466);
封头插入件(封头,“CPT”,1678);
封头插入件(封头,“NetApp”,6887);
封头插入件(封头,“EJ”,36937);
封头插入件(封头,“WFM”,41717);
封头插入件(封头,“SAS”,6046);
头部插入物(头部,“卡介苗”,1958年);
标题插入(标题“谷歌”,18500);
打印头;
CafePtr before=searchstr(头,“谷歌”);
CafePtr discard=searchstr(头,“BCG”);
移除(之前,丢弃);
before=searchstr(头,“谷歌”);
放弃=搜索STR(头,“SAS”);
移除(之前,丢弃);
CafePtr after_me=searchstr(头,“谷歌”);
插入(在“SAS”之后,6373);
之后=searchstr(头,“SAS”);
插入(在“CHGHS”之后,1378);
before=searchstr(标题“CHGHS”);
discard=searchstr(标题“WFM”);
移除(之前,丢弃);
之后=searchstr(头,“CHGHS”);
插入(在“BCG”之后,2314);
before=searchstr(头,“BCG”);
discard=searchstr(头,“EJ”);
移除(之前,丢弃);
after_me=searchstr(头,“BCG”);
插入(在“WFM”之后,43927);
before=searchstr(头,“WFM”);
discard=searchstr(标题为“NetApp”);
移除(之前,丢弃);
之后=searchstr(头,“WFM”);
插入(在“NetApp”之后,7426);
before=searchstr(标题为“NetApp”);
放弃=搜索STR(标题“CPT”);
移除(之前,丢弃);
after_me=searchstr(标题为“NetApp”);
插入(在“Hilcorp”之后,1012);
before=searchstr(头,“Hilcorp”);
放弃=搜索STR(头,“REI”);
移除(之前,丢弃);
之后=searchstr(头,“Hilcorp”);
插入(在“EJ”之后,35114);
//before=searchstr(头,“EJ”);
//丢弃=搜索STR(标题,“CHGHS”);计数=c;
温度->链接=头部;
压头=温度系数;
}
CafePtr searchnum(CafePtr&head,int-target)
{
这里的CafePtr=头部;
if(此处==NULL)
{
返回NULL;
}
其他的
{
while(此处->计数!=目标和此处->链接!=NULL)
这里=这里->链接;
如果(此处->计数==目标)
回到这里;
其他的
返回NULL;
}
}
CafePtr searchstr(CafePtr&head,字符串目标)
{
这里的CafePtr=头部;
if(此处==NULL)
{
返回NULL;
}
其他的
{
while(here->item!=target&&here->link!=NULL)
这里=这里->链接;
如果(此处->项目==目标)
回到这里;
其他的
返回NULL;
}
}
无效插入(字符后面的CafePtr,字符串i,int c)
{
CafePtr temp_ptr;
temp_ptr=新咖啡馆;
临时ptr->item=i;
温度->计数=c;
temp\u ptr->link=after\u me->link;
之后->链接=temp\u ptr;
}
无效打印(CafePtr头)
{
用于(CafePtr iter=head;iter!=NULL;iter=iter->link)
{
cout项目)链接;
删除丢弃;
}
好的

您需要销毁一个链接列表,并制作第二个与您销毁的链接列表完全相同的副本

让我们一步一步走

1) Remove one element from head of linked list 1
2) Add the element thus removed to the end of list 2.
或 1) 从链表1的尾部删除元素 2) 将这样删除的元素添加到链表2的头部

因为它是一个单数链表,所以让我们使用方法1/-删除1的头部,并添加到2的尾部

在此之前,您需要向现有的remove函数添加null保护

#include <iostream>
#include <string>
using namespace std;

struct Cafe
    {
    string item;
    int count;
    Cafe *link;
    };

typedef Cafe* CafePtr; 

void head_insert(CafePtr& head, string i, int c);
CafePtr searchnum(CafePtr& head, int target);
CafePtr searchstr(CafePtr& head, string target); 
void insert (CafePtr after_me, string i, int c);//insert a node in the list
void print (CafePtr head);                      //print the list
void remove(CafePtr before, CafePtr discard);   //remove a node from the list

int main(){

    CafePtr head;
    CafePtr iter, h;

    head = new Cafe;
    head->link = NULL;

    head_insert(head, "QL", 3808);
    head_insert(head, "CHGHS", 1312);
    head_insert(head, "REI", 10466);
    head_insert(head, "CPT", 1678);
    head_insert(head, "NetApp", 6887);
    head_insert(head, "EJ", 36937);
    head_insert(head, "WFM", 41717);
    head_insert(head, "SAS", 6046);
    head_insert(head, "BCG", 1958);
    head_insert(head, "Google", 18500);

    print (head);

    CafePtr before = searchstr(head, "Google"); 
    CafePtr discard = searchstr(head, "BCG");
    remove(before, discard);

    before = searchstr(head, "Google");
    discard = searchstr(head, "SAS"); 
    remove(before, discard);

    CafePtr after_me = searchstr(head, "Google");
    insert(after_me, "SAS", 6373);

    after_me = searchstr(head, "SAS");
    insert(after_me, "CHGHS", 1378);

    before = searchstr(head, "CHGHS");
    discard = searchstr(head, "WFM"); 
    remove(before, discard);

    after_me = searchstr(head, "CHGHS");
    insert(after_me, "BCG", 2314);

    before = searchstr(head, "BCG");
    discard = searchstr(head, "EJ"); 
    remove(before, discard);

    after_me = searchstr(head, "BCG");
    insert(after_me, "WFM", 43927);

    before = searchstr(head, "WFM");
    discard = searchstr(head, "NetApp"); 
    remove(before, discard);

    after_me = searchstr(head, "WFM");
    insert(after_me, "NetApp", 7426);

    before = searchstr(head, "NetApp");
    discard = searchstr(head, "CPT"); 
    remove(before, discard);

    after_me = searchstr(head, "NetApp");
    insert(after_me, "Hilcorp", 1012);

    before = searchstr(head, "Hilcorp");
    discard = searchstr(head, "REI"); 
    remove(before, discard);

    after_me = searchstr(head, "Hilcorp");
    insert(after_me, "EJ", 35114);

    //before = searchstr(head, "EJ");
    //discard = searchstr(head, "CHGHS"); <- If this bunch gets uncommented, the program breaks.
    //remove(before, discard);

/*  after_me = searchstr(head, "EJ");
    insert(after_me, "Ultimate", 1440);

    after_me = searchstr(head, "CHGHS"); //These things just need to be added after, these are the two final additions to the list
    insert(after_me, "CPT", 1896);
    */


    cout << endl;
    print(head); //If i remove this from the program, and uncomment the problem lines above, the program runs fine.
    return 0;

}

void head_insert(CafePtr& head, string i, int c)
{
    CafePtr temp_ptr;
    temp_ptr = new Cafe;

    temp_ptr -> item = i;
    temp_ptr -> count = c;

    temp_ptr -> link = head;
    head = temp_ptr;

}

CafePtr searchnum(CafePtr& head, int target)
{
    CafePtr here = head;

    if(here == NULL)
    {
        return NULL;
    }
    else
    {
        while(here->count !=target && here->link != NULL)
            here = here->link;
        if(here->count == target)
            return here;
        else
            return NULL;
    }
}

CafePtr searchstr(CafePtr& head, string target)
{
    CafePtr here = head;

    if(here == NULL)
    {
        return NULL;
    }
    else
    {
        while(here->item !=target && here->link != NULL)
            here = here->link;
        if(here->item == target)
            return here;
        else
            return NULL;
    }
}

void insert (CafePtr after_me, string i, int c)
{
    CafePtr temp_ptr;
    temp_ptr = new Cafe;
    temp_ptr->item = i;
    temp_ptr->count = c;

    temp_ptr->link = after_me->link;
    after_me->link = temp_ptr;          
}


void print (CafePtr head)
{

    for (CafePtr iter = head; iter !=NULL; iter=iter->link)
    {
        cout << (iter->item) << "\t" << (iter->count) << endl; //This line is where the debugger encounters a problem
    }
}

void remove(CafePtr before, CafePtr discard)
{
    before->link = discard->link;
    delete discard;                 
}

// The second argument is not needed. before's link should be discard.
void remove(CafePtr before) // , CafePtr discard)
{
    CafePtr discard = before->link;
    // The guard. If before is the tail.
    if (discard != NULL)
        before->link = discard->link;
    // deletion on NULL has no effect so the above guard is unnecessary here.
    delete discard;
}
// This will just remove the current head from linked list but won't delete the object.
CafePtr remove_head(CafePtr& head)
{
    if (head == NULL) return NULL;
    CafePtr to_discard = head;
    head = to_discard->link;
    to_discard->link = nullptr;
    return to_discard;
}
现在,我们需要添加一个remove_head函数

#include <iostream>
#include <string>
using namespace std;

struct Cafe
    {
    string item;
    int count;
    Cafe *link;
    };

typedef Cafe* CafePtr; 

void head_insert(CafePtr& head, string i, int c);
CafePtr searchnum(CafePtr& head, int target);
CafePtr searchstr(CafePtr& head, string target); 
void insert (CafePtr after_me, string i, int c);//insert a node in the list
void print (CafePtr head);                      //print the list
void remove(CafePtr before, CafePtr discard);   //remove a node from the list

int main(){

    CafePtr head;
    CafePtr iter, h;

    head = new Cafe;
    head->link = NULL;

    head_insert(head, "QL", 3808);
    head_insert(head, "CHGHS", 1312);
    head_insert(head, "REI", 10466);
    head_insert(head, "CPT", 1678);
    head_insert(head, "NetApp", 6887);
    head_insert(head, "EJ", 36937);
    head_insert(head, "WFM", 41717);
    head_insert(head, "SAS", 6046);
    head_insert(head, "BCG", 1958);
    head_insert(head, "Google", 18500);

    print (head);

    CafePtr before = searchstr(head, "Google"); 
    CafePtr discard = searchstr(head, "BCG");
    remove(before, discard);

    before = searchstr(head, "Google");
    discard = searchstr(head, "SAS"); 
    remove(before, discard);

    CafePtr after_me = searchstr(head, "Google");
    insert(after_me, "SAS", 6373);

    after_me = searchstr(head, "SAS");
    insert(after_me, "CHGHS", 1378);

    before = searchstr(head, "CHGHS");
    discard = searchstr(head, "WFM"); 
    remove(before, discard);

    after_me = searchstr(head, "CHGHS");
    insert(after_me, "BCG", 2314);

    before = searchstr(head, "BCG");
    discard = searchstr(head, "EJ"); 
    remove(before, discard);

    after_me = searchstr(head, "BCG");
    insert(after_me, "WFM", 43927);

    before = searchstr(head, "WFM");
    discard = searchstr(head, "NetApp"); 
    remove(before, discard);

    after_me = searchstr(head, "WFM");
    insert(after_me, "NetApp", 7426);

    before = searchstr(head, "NetApp");
    discard = searchstr(head, "CPT"); 
    remove(before, discard);

    after_me = searchstr(head, "NetApp");
    insert(after_me, "Hilcorp", 1012);

    before = searchstr(head, "Hilcorp");
    discard = searchstr(head, "REI"); 
    remove(before, discard);

    after_me = searchstr(head, "Hilcorp");
    insert(after_me, "EJ", 35114);

    //before = searchstr(head, "EJ");
    //discard = searchstr(head, "CHGHS"); <- If this bunch gets uncommented, the program breaks.
    //remove(before, discard);

/*  after_me = searchstr(head, "EJ");
    insert(after_me, "Ultimate", 1440);

    after_me = searchstr(head, "CHGHS"); //These things just need to be added after, these are the two final additions to the list
    insert(after_me, "CPT", 1896);
    */


    cout << endl;
    print(head); //If i remove this from the program, and uncomment the problem lines above, the program runs fine.
    return 0;

}

void head_insert(CafePtr& head, string i, int c)
{
    CafePtr temp_ptr;
    temp_ptr = new Cafe;

    temp_ptr -> item = i;
    temp_ptr -> count = c;

    temp_ptr -> link = head;
    head = temp_ptr;

}

CafePtr searchnum(CafePtr& head, int target)
{
    CafePtr here = head;

    if(here == NULL)
    {
        return NULL;
    }
    else
    {
        while(here->count !=target && here->link != NULL)
            here = here->link;
        if(here->count == target)
            return here;
        else
            return NULL;
    }
}

CafePtr searchstr(CafePtr& head, string target)
{
    CafePtr here = head;

    if(here == NULL)
    {
        return NULL;
    }
    else
    {
        while(here->item !=target && here->link != NULL)
            here = here->link;
        if(here->item == target)
            return here;
        else
            return NULL;
    }
}

void insert (CafePtr after_me, string i, int c)
{
    CafePtr temp_ptr;
    temp_ptr = new Cafe;
    temp_ptr->item = i;
    temp_ptr->count = c;

    temp_ptr->link = after_me->link;
    after_me->link = temp_ptr;          
}


void print (CafePtr head)
{

    for (CafePtr iter = head; iter !=NULL; iter=iter->link)
    {
        cout << (iter->item) << "\t" << (iter->count) << endl; //This line is where the debugger encounters a problem
    }
}

void remove(CafePtr before, CafePtr discard)
{
    before->link = discard->link;
    delete discard;                 
}

// The second argument is not needed. before's link should be discard.
void remove(CafePtr before) // , CafePtr discard)
{
    CafePtr discard = before->link;
    // The guard. If before is the tail.
    if (discard != NULL)
        before->link = discard->link;
    // deletion on NULL has no effect so the above guard is unnecessary here.
    delete discard;
}
// This will just remove the current head from linked list but won't delete the object.
CafePtr remove_head(CafePtr& head)
{
    if (head == NULL) return NULL;
    CafePtr to_discard = head;
    head = to_discard->link;
    to_discard->link = nullptr;
    return to_discard;
}
现在在这里施展你的魔法

我会把剩下的作为家庭作业告诉你。如果有帮助,请告诉我

我不知道你想做什么。但是你目前的链表方法设计是错误的

在标准单链表中,应采用以下方法:

// Insert should accept preallocated toInsert element and a after pointer after which we want to insert
void insert(CafePtr toInsert, CafePtr after);
// Remove should accept the element to remove. If elemToRemove not found, it should return gracefully.
void remove(CafePtr elemToRemove);
上述方法提供了更多的优雅和更多的控制

但在当前的代码中,您可以这样做

before = searchstr(head, "SAS");
discard = searchstr(head, "CHGHS"); //<- If this bunch gets uncommented, the program breaks.
before=searchstr(头,“SAS”);

放弃=搜索STR(标题“CHGHS”);//你想要删除和插入函数的实现吗?我试过你说的Mohan,但我不知道要更改什么。你能把你编写的代码发给我吗,这样就很清楚了?我只是不知道该怎么做。我想我明白你的意思了。一切的目标都是编辑我拥有的链接列表,并将其转换为第二个链接列表使用insert和remove列出。我不认为我应该有两个单独的链表。很酷。很高兴我能提供帮助。因此我更改了代码,并添加了insert和delete部分。当我到达第92行时,程序中断。我运行调试器,打印函数就在中断的地方。我不知道问题出在哪里。我更新了上面的问题,然后出现问题的代码中有一条注释。而(here->item!=target&&here->link!=NULL)here=here->link;如果here达到NULL,它将中断。对不起,我不确定如何解决问题。您能告诉我需要在程序中添加什么吗?