C++中的单向链表

One-way linked list in C++

本文关键字:链表 C++      更新时间:2023-10-16

我开始研究算法和数据结构。我决定尝试一下单向链表。它包含诸如在所选元素之后插入元素,删除具有给定值的元素并返回已删除项目数量的函数,返回列表和类的当前内容的函数以写入和读取文件。功能有一个小问题,必须添加新元素。调试器返回以下错误:

在 AiSD.exe 中0x00e71ea2的首次机会异常:0xC0000005:访问冲突读取位置0x00000000。

在 AiSD.exe 中0x00e71ea2处未处理的异常:0xC0000005:访问冲突读取位置0x00000000。

看起来像指针的问题,但我不知道如何解决它。这不是我现在的专长...还!所以我请你帮我。有一个代码:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct Node
{
    Node *next;
    int key;
};
class List
{
public:
    Node *head;
    unsigned int counter;
    List()
    {
        head = NULL;
        counter = 0;
    }
    unsigned size(Node *p)
    {
        unsigned int c=0;
        while(p)
        {
            c++;
            p = p->next;
        }
        return c;
    }

    void Addafter(Node *e, int v)
    {
    Node *p = new Node;
    p->next = e->next; //there's a problem
    p->key = v;
    e->next = p;
    }   
    int Delete(int v)
    {
        Node *p = new Node;
        int count = 0;
        while(p->next != NULL)
        {
            if(p->key = v)
            {
                delete p;
                count++;
                return count;
            }
        }
    }
    void Write()
    {
        string data;
        fstream file;
        file.open("D:\plik2.txt", ios::out);
        Node *p = head;
        while(p->next != NULL)  
        {
            p = p->next;
            int wartosc = p->key;
            file<<wartosc;
        }
        file.close();
    }
    void Read()
    {
        string data;
        fstream file;
        file.open("D:\plik.txt", ios::in);
        Node *p = head;
        for(int i=0; i<counter; i++)
        {
            getline(file, data);
            int result = atoi(data.c_str());
            p->key = result;
            p = p->next;
        }
        file.close();
    }

};
int main()
{
    List a;
    a.Read();
    a.Addafter(a.head, 3);
    a.Delete(5);
    a.size(a.head);
    system("PAUSE");
    return 0;
}

当你

输入 AddAfter 方法时,a.head 是 NULL。所以发生的事情是:

addAfter(Node *e /*Null in this case*/, int v) {
    Node *p = new Node; // Ok.
    p->next = e->next; // It is equivalent to p = NULL->next Which just segfaults.
}

在这种情况下,您可能想要执行以下操作:

addAfter(Node *e /*Null in this case*/, int v) {
        Node *p = new Node;
        p->key = v;
        if (e) {
            p->next = e->next; 
            e->next = p;
        }
        else {
            e = p;
            e->next = NULL;
        }
}

每当你做链表时,拿出一张纸,一步一步地画出你的代码正在做什么(小框和箭头很好地表示链表,让你把它布置出来,这样人眼就可以理解/看到。