回 帖 发 新 帖 刷新版面

主题:求高人帮我修改一下链表程序

#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);
}

回复列表 (共9个回复)

沙发

补充一下,构造函数没有问题,插入和删除功能不能实现。调试的时候 显示是  s->next=a->next;
该语句的问题。我用的是 VC6.0

板凳

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 楼

谢谢你!可是还是不行,调试时出现语句:0X004015a8指令引用的0X00000004内存。
该内存不能为read。

4 楼

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 楼


谢谢,可是调试的时候还是出现同样的错误,内存不能为read

6 楼

[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 楼

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 楼


谢谢!按照你指示改了后,调试时还是出现 该内存不能为read, 我都怀疑是不是我的
VC6.0有问题哦!

9 楼


终于找出错误原因了;该程序应该为
#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()
{
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册