a13764946 2024-09-21 21:14 采纳率: 22.2%
浏览 2

链表的创建与增删查改问题

感觉写的没毛病但是却运行结果总是出乎意料的离谱


#include<iostream>
#include<malloc.h>
int n;
using namespace std;


typedef struct Student{
string name;
int age;
struct Student next;
}Student;
//创建
Student creat_list(int n)
{
Student *list=(Student *)malloc(sizeof(Student));
if(list==NULL) return NULL;
Student *p=list;
cout<<“请输入链表内部信息”<<endl;
for(int i=0;i<n;i++)
{
Student *tmp=(Student *)malloc(sizeof(Student));
string name1;
int age1;
cin>>name1>>age1;
tmp->name=name1;
tmp->age=age1;
p->next=tmp;
p=p->next;
}
p->next=NULL;
return list;
}


//增
Student* insertelem(Student list,int pos,Student obj)
{
if(pos<0 ||pos>n)
{
cout<<“error input”<<endl;
}
Student vis;
Student p1=list;
vis->age=obj->age;vis->name=obj->name;
int i=0;
while(i<pos){
i++;
p1=p1->next;
}
vis->next=p1->next;//vis.next->p1.next
p1->next=vis;
return list;
}


//删
Student* deleteelem(Student *list,int pos)
{
if(pos>0 ||pos>n)
{
cout<<“error input”;
}
int i=0;
Student p1=list;
while(i<pos){
i++;
p1=p1->next;
}
Student tmp=p1->next;
p1=tmp->next;
free(tmp);
return list;
}
//查
void searchelem(Student list,string name1)
{
bool flag=true;
Student vis;
for(vis=list;vis!=NULL;vis=vis->next)
{
if(vis->name==name1)
{
cout<<vis->age;
cout<<“successfully founded it”<<endl;
flag=false;
}
}
if(flag){
cout<<“dint’t founded it”<<endl;
}
}
//改
Student modifyelem(Student list,Student *obj){
Student *p;
for(p=list;p;p=p->next){
if(p->name==obj->name)
{
string newname;int newage;
cin>>newname>>newage;
p->name=newname;
p->age=newage;
}
}
return list;
}
//show
void list_visit(Student *list){
if(list==NULL){
return ;
}
else
{
for(Student *p=list;p;p=p->next)
{
cout<<p->name<<" "<<p->age<<endl;
}
}
}


int main()
{
cout<<“开始创建链表,请输入链表大小”<<endl;
cin>>n;
Student* list=creat_list(n);
cout<<“链表创建完毕,链表信息如下”<<endl;
list_visit(list);
cout<<“开始插入新成员”<<endl;
Student* p=(Student )malloc(sizeof(Student));
p->name=“cmy”;p->age=20;
insertelem(list,1,p);
cout<<“插入后的链表信息如下”<<endl;
list_visit(list);
cout<<“删除2号成员后信息如下”<<endl;
deleteelem(list,2);
list_visit(list);
cout<<“查诈rb同学是否存在链表”<<endl;
searchelem(list,“rb”);
cout<<“修改tp同学信息后的链表信息”<<endl;
Student p1=(Student *)malloc(sizeof(Student));
p1->name=“tp”;
modifyelem(list,p1);
list_visit (list);
return 0;
}这个链表创建与增删查改还有什么问题
  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-09-21 21:15
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    您的代码大体上是正确的,但存在一些问题,我会逐一指出并给出解决方案。

    问题一:malloc的使用问题 在您的代码中,你使用了malloc来分配内存,但没有在合适的位置释放这些内存。当您创建链表并添加节点时,每个节点都是用malloc分配的。然而,当您删除节点时,您释放了节点的内存,但没有释放链表的头节点。这可能会导致内存泄漏。在程序结束时,您应该释放整个链表的内存。此外,malloc和free函数返回的是void类型,不需要强制转换为其他类型。所以应该直接使用malloc和free而不是加括号和类型强制转换。因此,main函数结束时应该有一个释放整个链表内存的语句,如下:

    free(list); // 在main函数末尾释放整个链表的内存
    

    问题二:代码错误检查不完整问题 例如在你的查找函数 searchelem 中,你应该设置一个标记(如布尔变量)来判断链表中是否有满足条件的元素,而不是通过改变函数外变量的状态来判断是否找到了元素。否则,如果函数被多次调用,之前的标记状态会影响当前的结果判断。同样的问题也出现在你的修改函数中。修改函数应该返回修改是否成功的信息,而不是仅仅返回链表的头指针。此外,你的修改函数没有检查是否找到了需要修改的对象,如果找不到对象则无法修改成功。应该在找不到对象时给出相应的提示信息。

    问题三:输入和输出格式问题 在你的代码中使用了中文字符作为字符串字面量(如“开始创建链表”),这可能会导致在某些编译器或环境中无法正确显示或编译的问题。建议使用英文字符作为字符串字面量。另外,你的代码中的引号使用不正确(如 p->name=“cmy”),应该使用英文的单引号(')。而不是中文字符的引号(“)。这可能导致编译器无法识别变量名或者字符串字面量的问题。最后注意在你的代码中输入输出格式化输出流使用的符号应该是英文符号而不是中文符号。例如使用 cout << "请输入链表内部信息:" << endl; 而不是 cout<<“请输入链表内部信息”<<endl;。同样的问题也存在于你的其他代码中。请确保所有的字符串字面量和符号都是英文字符。

    问题四:增删节点算法有误 你的增删节点的代码没有问题检测,导致删除可能在不合适的点停止删除链节点从而导致空指针问题或者在不应该的位置进行节点的创建等引起预期外结果等问题出现概率提高的情况等所以在你设计删除增加操作后都应检验新的节点的状态和位等为算法进行对确保结果准确否则出现误删除节点或数据不一致等情况具体可以参考具体的操作结果对你的增删算法进行测试与改进你的删除函数应该将最后一个节点的指针设为NULL以断开通向已经删除的节点的引用你的增加节点可以在开始时为整个链表初始化一个空的头节点然后进行链接可以避免从头节点开始的查找的复杂度过高等问题这里对操作完成后记得处理相关操作中的节点状态的异常和检测对异常进行恰当的处理有助于减少算法出现错误的可能性的问题出现概率的降低对代码进行充分的测试保证程序的健壮性是非常必要的。希望这些修正建议能帮助你改进你的代码并解决问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 9月21日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?