主题:求高人帮我修改一下链表程序
zzx131 [专家分:30] 发布于 2010-04-10 17:17:00
#if !defined(LINLLIST_H)
#define LINKLIST_H
#include<iostream>
using namespace std;
const int listsize=100;
struct Lnode //结构体;
{
char data;
Lnode *next;
};
class linklist
{
private:
int length;
Lnode *p;
public:
linklist(char a[],int i);
void list_insert(linklist &L,int i,int x);//插入;
void list_delete(linklist &L,int i);//删除;
void locate_list(linklist &L,int x);//查找元素x;
~linklist();
};
#endif
#include"linklist.h"
linklist::linklist(char a[listsize],int i)
{
length=i;
p=new Lnode;Lnode *r;
r=p;
for(int j=0;j<=i;j++)
{
Lnode *s;
s=new Lnode;
r->next=s;s->data=a[j];cout<<s->data<<" ";
}
r->next=0;
}
void linklist::list_insert(linklist &L,int i,int x)//在表的第i个位置,插入元素x;
{
if(i<0||i>L.length) cout<<"i值不合法,重新输入:";
Lnode *a;Lnode *s;
a=p;
int j=0;
while(a&&j<i-1)
{
a=a->next;
j++;
}
s=new Lnode;s->data=x;
s->next=a->next;
a->next=s;
}
void linklist::list_delete(linklist &L,int i)//删除表中第i个位置的元素;
{
if(i<0) cout<<"i值不合法,重新输入:";
Lnode *a;
a=p;
int j=0;
while(a->next||j<i-2)
{
a=a->next;
j++;
}
a->next=a->next->next;
delete a;
}
linklist::~linklist()
{
}
#include"linklist.h"
void main()
{
char a[listsize];
cout<<"输入元素:"<<endl;
for(int i=0;i<=5;i++)
{
char s;
cin>>s;
a[i]=s;
}
linklist L(a,5);
L.list_insert(L,3,5);
L.list_delete(L,3);
}
最后更新于:2010-04-11 10:30:00
回复列表 (共9个回复)
沙发
zzx131 [专家分:30] 发布于 2010-04-10 17:22:00
补充一下,构造函数没有问题,插入和删除功能不能实现。调试的时候 显示是 s->next=a->next;
该语句的问题。我用的是 VC6.0
板凳
liudan319 [专家分:3780] 发布于 2010-04-10 22:08:00
void linklist::list_delete(linklist &L,int i)//删除表中第i个位置的元素;
{
if(i<0) cout<<"i值不合法,重新输入:";
Lnode *a;
a=p;
int j=0;
while(a->next||j<i-2)
{
a=a->next;
j++;
}
a->next=a->next->next;
delete a;
}
删除有问题啊,找到第i向后,p=a->next
然后a->next=a->next->next
delete p;
3 楼
zzx131 [专家分:30] 发布于 2010-04-11 00:02:00
谢谢你!可是还是不行,调试时出现语句:0X004015a8指令引用的0X00000004内存。
该内存不能为read。
4 楼
elst5523183 [专家分:210] 发布于 2010-04-11 03:28:00
void list_insert(linklist &L,int i,int x);//插入;
void list_delete(linklist &L,int i);// 删除;
void locate_list(linklist &L,int x);//查找元
既然这些都是成员函数,而且这些看你这些函数都是修改本身的链表..就无需传入另外一个linklist..
直接访问私有成员就行了...
5 楼
zzx131 [专家分:30] 发布于 2010-04-11 11:18:00
谢谢,可是调试的时候还是出现同样的错误,内存不能为read
6 楼
elst5523183 [专家分:210] 发布于 2010-04-11 13:05:00
[quote]void linklist::list_delete(linklist &L,int i)//删除表中第i个位置的元素;
{
if(i<0) cout<<"i值不合法,重新输入:";
Lnode *a;
a=p;
int j=0;
while(a->next||j<i-2)
{
a=a->next;
j++;
}
a->next=a->next->next;
delete a;
}
删除有问题啊,找到第i向后,p=a->next
然后a->next=a->next->next
delete p;[/quote]
楼主的p是私有成员....
应该 新建一个Lnode *s;
s=a->next;
a->next=a->next->next;
delete s;
7 楼
elst5523183 [专家分:210] 发布于 2010-04-11 13:17:00
list_insert里面的
while(a&&j<i-1) 改成 while(j>i-1 && a)
list_delete里面的
while(a->next||j<i-2)改成while(j>i-2 && a->next)
8 楼
zzx131 [专家分:30] 发布于 2010-04-11 14:09:00
谢谢!按照你指示改了后,调试时还是出现 该内存不能为read, 我都怀疑是不是我的
VC6.0有问题哦!
9 楼
zzx131 [专家分:30] 发布于 2010-04-13 20:20:00
终于找出错误原因了;该程序应该为
#include"linklist.h"
linklist::linklist(int i)//构造了一个有头结点的单链表;
{
length=i;Lnode *r;
p=new Lnode;
r=p;
for(int j=0;j<=i;j++)
{
Lnode *s;
s=new Lnode;
cin>>s->data;
r->next=s;r=s;
}
r->next=0;
}
void linklist::list_show(linklist &L)
{
Lnode *a;a=L.p;
for(int i=0;i<=L.length;i++)
{
a=a->next;//指针的移动;
cout<<a->data<<" ";
}
cout<<endl;
}
void linklist::list_insert(linklist &L,int i,char x)//在表的第i个位置,插入元素x;
{
if(i<0||i>L.length) cout<<"i值不合法,重新输入:";
Lnode *a;Lnode *s;
a=L.p;
int j=0;
while(a&&j<(i-1))//找到插入位置;
{
a=a->next;
j++;
}
s=new Lnode;
s->data=x;
s->next=a->next;
a->next=s;
L.length++;
}
void linklist::list_delete(linklist &L,int i)//删除表中第i个位置的元素;
{
if(i<0||i>L.length) cout<<"i值不合法,重新输入:";
Lnode *s,*a;
a=L.p;
int j=0;
while(j<i-2&&a->next)
{
a=a->next;
j++;
}
s=a->next;
a->next=s->next;
delete s;
L.length--;
}
linklist::~linklist()
{
}
我来回复