鱼C论坛

 找回密码
 立即注册
查看: 1824|回复: 1

有序单链表删除重复元素(附加代码模式)(求指出错误在哪和一份正确代码)

[复制链接]
发表于 2021-9-21 12:04:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
算法2-25 有序单链表删除重复元素(附加代码模式)
根据一个递增的整数序列构造有序单链表,删除其中的重复元素
本题是附加代码模式,主函数main的代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释掉自己的main函数。
main函数代码如下:
int main()
{
    int n, status = -1;
    while (cin >> n)
    {
        if (n == 0)
        {
            cout << "list is empty\n";
            continue;
        }
        List list;
        InitList(list);
        for (int i = 0; i < n; i++)
        {
            int v;
            cin >> v;
            AddNode(list, v);
        }
        PrintList(list);
        RemoveDuplicate(list);
        PrintList(list);
        DestroyList(list);
    }
    return 0;
}
单链表的结构体定义和相应的操作函数如下图所示:
struct Node
{
    int data;
    Node *next;
};
typedef Node *List;
int InitList(List list)
void DestroyList(List list)
int AddNode(List list, int data)
void PrintList(const List list)


我自己写了一份代码,但是提交结果显示Segmentation fault,这个错误出在哪里
代码如下

#include <iostream>
using namespace std;
struct Node
{
    int data;
    Node *next;
};
typedef Node *List;
int InitList(List list)
{
    list = new Node;
    list->next = NULL;
    return 1;
}
void DestroyList(List list)
{
    List p = list->next;
    while (p)
    {
        List temp = p;
        p = p->next;
        delete temp;
    }
    delete list;
}
int AddNode(List list, int data)
{
    List p = list, newnode = NULL;
    while (p->next != NULL)
    {
        p = p->next;
    }
    newnode = new Node;
    newnode->data = data;
    p->next = newnode;
    newnode->next = NULL;
    return 1;
}
void PrintList(const List list)
{
    List p = list->next;
    while (p)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}
void RemoveDuplicate(List list)
{
    List p = list, last;
    while (p)
    {
        last = p;
        while (p && last->data == p->data)
        {
            List temp;
            temp = p;
            p = p->next;
            if (temp != last)
            {
                free(temp);
            }
        }
        last->next = p;
    };
}
int main()
{
    int n, status = -1;
    while (cin >> n)
    {
        if (n == 0)
        {
            cout << "list is empty\n";
            continue;
        }
        List list;
        InitList(list);
        for (int i = 0; i < n; i++)
        {
            int v;
            cin >> v;
            AddNode(list, v);
        }
        PrintList(list);
        RemoveDuplicate(list);
        PrintList(list);
        DestroyList(list);
    }
    return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-21 16:55:33 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-21 16:59 编辑

好好看看实参、形参相关的知识
int InitList(List &list)
{
    list = new Node;
    list->next = NULL;
    return 1;
}

或者
int InitList(List *plist)
{
    *plist = new Node;
    *plist->next = NULL;
    return 1;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 10:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表