用c++写的一个单链表,在遍历的时候有错误

糖宋元明清 2017-10-09 07:58:55
我的代码

#include<iostream>
using namespace std;
struct List
{
int data;
struct List* link;
};

void initList(List* first);
void clearList(List* first);
int Length(List* first);
List* Search(List* first,int x);
List* Locate(List* first,int i);
int Insert(List* first,int i,int x);
int Remove(List* first,int i,int& x);
int main()
{
List a;
initList(&a);

Insert(&a,1,1);
Insert(&a,2,2);
Insert(&a,3,3);
Insert(&a,4,4);
Insert(&a,5,5);

cout<<Length(&a);//就是在Length这个函数出错的
List* p;
p=a.link;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->link;
}


}
void initList(List* first)
{
first=new List[20];
first->link=NULL;
}
void clearList(List* first)
{
List* p;
while(first->link!=NULL)
{
p=first->link;first=p->link;
delete p;
}
}
int Length(List* first)
{
int count=0;
List* p;
p=first->link;
while(p!=NULL)//当遍历到最后一个结点的时候,最后一个结点的指针域为ox4,而不是ox0;所以条件判断为真,会在执行一次
{ p=p->link;count++; }
return count;
}
List* Locate(List* first,int i)
{
List * p=first;
int k=0;
while(p!=NULL&&k<i)
{ p=p->link;k++;}
return p;
}
int Insert(List* first,int i,int x)
{
List* p=Locate(first,i-1);
List* s=new List[20];
s->data=x;
s->link=p->link;
p->link=s;

}


问题描述
在这行代码
first->link=NULL

按我的理解first->link应该为ox0;
但是我调试了一遍发现时ox4.导致在计算链表长度时(也就是在Length这个函数中),遍历到最后一个结点时,会继续往下遍历。导致程序错误。
求大神解决
...全文
427 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
糖宋元明清 2017-10-12
  • 打赏
  • 举报
回复
引用 1楼赵4老师 的回复:
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
嗯,谢谢
糖宋元明清 2017-10-12
  • 打赏
  • 举报
回复
引用 6楼baidu_37097818 的回复:
我很好奇那个20是怎么来的
那是我本来想为list指针分配空间,但是我忽略了两点,1此时我声明的的list类型系统已经为他分配了空间,如果再用new的话,可能是建立了一个副本 2new运算符并不能分配指定空间大小
开心秋水 2017-10-11
  • 打赏
  • 举报
回复
我很好奇那个20是怎么来的
糖宋元明清 2017-10-11
  • 打赏
  • 举报
回复
引用 3楼孤雲独去闲 的回复:
void initList(List* first) { first=new List[20]; first->link=NULL; } 问题出在这,通过first=new List[20]这个语句,first所指向的就不再是a的地址了,这样下面的=NULL其实就不是对a进行的操作,这样a实际上并没有被初始化为NULL,被初始化的实际上是new出来的,然后退出函数后,这个new出来的内存也访问不到了。因为a是局部变量,所以这个函数里不需要new的那一句。
是不是相当于建立了一个副本?
糖宋元明清 2017-10-11
  • 打赏
  • 举报
回复
引用 2楼自信男孩 的回复:
#include<iostream>

using namespace std;

struct List
{
    int data;
    struct List* link;
};

void initList(List* first);
void clearList(List* first);
int Length(List* first);
List* Search(List* first,int x);
List* Locate(List* first,int i);
int Insert(List* first,int i,int x);
int Remove(List* first,int i,int& x);

int main()
{
    List a;
    initList(&a);

    Insert(&a,1,1);
    Insert(&a,2,2);
    Insert(&a,3,3);
    Insert(&a,4,4);
    Insert(&a,5,5);

    cout<<Length(&a);
    List * p;
    p = a.link;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->link;
    }


}
void initList(List* first)
{
    //first = new List[sizeof(List)];    /*注释掉这句*/
    first->link = NULL;
}
void clearList(List* first)
{
    List* p;
    while(first->link!=NULL)
    {
        p = first->link;
        first = p->link;
        delete p;
    }
}
int Length(List* first)
{
    int count=0;
    List* p;
    p=first->link;
    while(p)
    {    p = p->link;
        count++;
    }
    return count;
}
List* Locate(List* first,int i)
{
    List * p = first;
    int k=0;
    while(p && k<i)
    {
        p = p->link;
        k++;
    }
    return p;
}
int Insert(List* first,int i,int x)
{
    List* p = Locate(first,i-1);
    List* s = new List[sizeof(List)];
    s->data=x;
    s->link=p->link;
    p->link=s;

    return 0;
}
只需要注释掉初始化函数initList里的一句就可以了 另外,new的空间应该使用sizeof一下,而不是每次都是20. 为什么注释掉一句就可以,因为main函数里定义的a是结构体变量而不是指针。
嗯,谢谢
赵4老师 2017-10-10
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
孤雲独去闲 2017-10-10
  • 打赏
  • 举报
回复
void initList(List* first) { first=new List[20]; first->link=NULL; } 问题出在这,通过first=new List[20]这个语句,first所指向的就不再是a的地址了,这样下面的=NULL其实就不是对a进行的操作,这样a实际上并没有被初始化为NULL,被初始化的实际上是new出来的,然后退出函数后,这个new出来的内存也访问不到了。因为a是局部变量,所以这个函数里不需要new的那一句。
自信男孩 2017-10-10
  • 打赏
  • 举报
回复
#include<iostream>

using namespace std;

struct List
{
    int data;
    struct List* link;
};

void initList(List* first);
void clearList(List* first);
int Length(List* first);
List* Search(List* first,int x);
List* Locate(List* first,int i);
int Insert(List* first,int i,int x);
int Remove(List* first,int i,int& x);

int main()
{
    List a;
    initList(&a);

    Insert(&a,1,1);
    Insert(&a,2,2);
    Insert(&a,3,3);
    Insert(&a,4,4);
    Insert(&a,5,5);

    cout<<Length(&a);
    List * p;
    p = a.link;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->link;
    }


}
void initList(List* first)
{
    //first = new List[sizeof(List)];    /*注释掉这句*/
    first->link = NULL;
}
void clearList(List* first)
{
    List* p;
    while(first->link!=NULL)
    {
        p = first->link;
        first = p->link;
        delete p;
    }
}
int Length(List* first)
{
    int count=0;
    List* p;
    p=first->link;
    while(p)
    {    p = p->link;
        count++;
    }
    return count;
}
List* Locate(List* first,int i)
{
    List * p = first;
    int k=0;
    while(p && k<i)
    {
        p = p->link;
        k++;
    }
    return p;
}
int Insert(List* first,int i,int x)
{
    List* p = Locate(first,i-1);
    List* s = new List[sizeof(List)];
    s->data=x;
    s->link=p->link;
    p->link=s;

    return 0;
}
只需要注释掉初始化函数initList里的一句就可以了 另外,new的空间应该使用sizeof一下,而不是每次都是20. 为什么注释掉一句就可以,因为main函数里定义的a是结构体变量而不是指针。
C++课程设计-单链表——学生信息管理系统全文共9页,当前为第1页。C++课程设计 单链表——学生信息管理系统 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第1页。 学生信息管理系统设计文档 设计任务描述 为了实现学籍管理的简单化,我们基于Visual C++集成开发环境编了"学生信息管理系统"软件,该软件适用于所有windows操作系统,面向广大用户,界面简洁,操作简单。此软件主要是实现对学生学籍信息进行系统化的管理,可以对学生基本信息进行添加、删除、查找、修改以及对学生成绩的管理,主要是根据学生的学号及其姓名进行操作的。该软件可以更加方便管理者管理学生学籍信息。 功能需求说明 该系统所需要的功能有:1、链表的建立; 2、学生信息的插入; 3、学生信息的查询; 4、学生信息的输出; 5、学生信息的修改; 6、学生信息的删除; 7、良好的欢迎选择界面。 三、总体方案设计 一、实现任务的方法 1、在欢迎选择界面中,使用Switch 这一选择结构来连接程序的执行和用户的命令; 2、在从学生信息的建立直到删除,都是使用链表的相关知识; 3、在定义学生信息时,建立一个Inform 类;在定义学生课程成绩时,自定义了一个achieve 结构体; 总体结构 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第2页。 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第2页。 三、模块划分 (1)链表的建立。 (2)对链表信息的插入。 (3)对链表信息的查找。 (4)对链表信息的输出。 (5)对链表信息的删除。 (6)对链表信息的修改。 课程成绩信息作为附加信息,穿插于各个模块中。 数据结构说明 一、自定义的数据结构: 1、achieve(课程成绩)用于存放课程成绩信息包括课程数、课程名、成绩、学分、总分和平均分。 2、inform(学生基本信息)用于存放学生基本信息,包括姓名、学号、性别等。 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第3页。3、结点结构-Nodetype,定义了数据域inform和指针域next; C++课程设计-单链表——学生信息管理系统全文共9页,当前为第3页。 二、类 Student 用于存放处理学生信息的各个功能函数,private 成员是链表的头指针。 各模块设计说明 一、建立: 首先:建立一个空链表: Student::Student() {head=new Nodetype; head->next=NULL; 表明这是一个空链表 cout<<"请建立链表\n"; } C++课程设计-单链表——学生信息管理系统全文共9页,当前为第4页。然后建立链表: C++课程设计-单链表——学生信息管理系统全文共9页,当前为第4页。 二、添加:按照学号从小到大的顺序插入: 三、输出:将链表的数据输出,由于上述操作,输出时会按照学号从小到大的顺序输出。 四、查找:利用学号和姓名两种方式进行查找,查找时主要是遍历链表进行判断 while(p!=NULL&&(d==1&&strcmp(input,p->data.num)!=0)""(d==2&&strcmp(input,p->data.name)!=0)) {p=p->next; } //遍历链表查找符合要求的节点 五、删除:利用节点的删除操作,找到链表中第i-1个结点,修改其指向后继的指针: q = p->next; p->next = q->next; delete(q); 六、更改:利用查找的操作,查到后在进行重新输入的操作; 测试情况说明 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第5页。测试一:学生信息的输入和输出都正常,但是查找、删除和修改时都只能对第一个数据进行操作,如下图所示: C++课程设计-单链表——学生信息管理系统全文共9页,当前为第5页。 但是当要进行查找、删除、修改操作时,系统只能对第一个对象进行操作 查看程序时,发现查找函数、删除和修改函数都有个逻辑错误 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第6页。全部修改后,程序的上述错误就没再出现了。 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第6页。 错误二:当提示是否输入课程成绩信息时,输入第一门课程名时,会出现无穷循环 但当输入第一门课程后就会出现下图所示状况: 对于这种状况,我百思不得其解,后来请教其他同学,他告诉我错误在于声明课程成绩信息时出错了 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第7页。应该为二维数组,修改之后,课程成绩输入输出便正常了 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第7页。 错误三:输入学生信息时不按照学号大小顺序,输出结果时也不

65,126

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧