C++ C++;使用“插入”和“删除”修改链接列表
我需要获取第一个链表,并使用insert和remove函数将其转换为第二个被注释的链表。我一辈子都不知道该怎么做,因为我不知道如何多次使用remove函数或insert函数 编辑:我更新了代码,插入和删除了某些部分,程序在打印功能中遇到问题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
#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,它将中断。对不起,我不确定如何解决问题。您能告诉我需要在程序中添加什么吗?