首页 > 编程语言 >算法2-25 有序单链表删除重复元素(附加代码模式)

算法2-25 有序单链表删除重复元素(附加代码模式)

时间:2025-01-17 21:58:23浏览次数:3  
标签:Node 25 单链 int List list next 链表 算法

题目描述

根据一个递增的整数序列构造有序单链表,删除其中的重复元素
本题是附加代码模式,主函数main和打印链表的代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释附加代码。
附加代码如下:

void PrintList(const List &list){
    Node *p = list->next;
    if(p == NULL){
        cout<<"list is empty"<<endl;
    }else{
        while(p != NULL){
            cout << p->data << " ";
            p = p->next;
        }
    }
    cout << endl;
}

int main(){
    int n;
    while(cin >> n){
        if( n ==0) {
            cout<<"list is empty"<<endl;
            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;
} 
输入

输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开

输出

针对每组测试数据,输出包括两行,分别是删除前和删除后的链表元素,用空格隔开 如果链表为空,则只输出一行,list is empty

样例输入
5 1 2 3 4 5
5 1 1 2 2 3
0
样例输出
1 2 3 4 5 
1 2 3 4 5 
1 1 2 2 3 
1 2 3 
list is empty

提示

单链表的结构体定义和相应的操作函数如下图所示:

#include <iostream>
using namespace std;

struct Node{
    int data;
    Node* next;
};

typedef Node* List;

int InitList(List &list){
    return 0;

}

int DestroyList(List &list){
    return 0;
}

int AddNode(List &list, int data){

    return 0;
}

void RemoveDuplicate(List &list){
}

 解:

#include <iostream>
#include <stdlib.h>
using namespace std;

struct Node{
    int data;
    Node* next;
};

typedef Node* List;

int InitList(List &list){
	list=(Node*)malloc(sizeof(Node));//头结点内存分配(暂时不考虑内存分配失败情况)
	list->next=NULL;//下一个结点为空
    return 0;
}

int DestroyList(List &list){
	Node *p=list->next;
	while(p!=NULL)
	{
		Node *q;
		q=p;
		p=p->next;//p前行
		free(q);//q释放
	}
    return 0;
}

int AddNode(List &list, int data){
    Node *p=list,*q;
    q=(Node*)malloc(sizeof(Node));//新结点内存分配
    while(p->next!=NULL){
    	p=p->next;
	}//找到链表表尾
    q->data=data;
    q->next=NULL;//q结点初始化
    p->next=q;//将p设为q的直接前驱
    return 0;
}

void RemoveDuplicate(List &list){
	Node *p,*q,*e;
	p=list;
	q=p->next;
	while(q!=NULL){
		if(q->data==p->data){//相等时放空相同数据的后一个结点(其中已经考虑到最后两结点相同)
			e=q;
			p->next=q->next;
			q=q->next;
			free(e);
		}
		else{//不相等时p,q同时前移
			p=p->next;
			q=q->next;
		}
	}
}

void PrintList(const List &list){
    Node *p = list->next;
    if(p == NULL){
        cout<<"list is empty"<<endl;
    }else{
        while(p != NULL){
            cout << p->data << " ";
            p = p->next;
        }
    }
    cout << endl;
}

int main(){
    int n;
    while(cin >> n){
        if( n ==0) {
            cout<<"list is empty"<<endl;
            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;
} 

 

标签:Node,25,单链,int,List,list,next,链表,算法
From: https://blog.csdn.net/2301_77185332/article/details/145191124

相关文章

  • 算法2-1:集合union
    题目描述假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B。这就要求对线性表做如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去。只要从线性表LB中依次取得每个元素,并......
  • 「TC SRM625 D1L3」Seatfriends
    思路首先,对于计数题,不是\(\text{dp}\)就是排列组合,这题多思考一会儿就发现单纯\(\text{dp}\)和排列组合是做不出来的。然后激动人心地发现,这题是\(\text{dp}\+\)排列组合。现在来思考怎么做,我们可以发现如果不考虑区间两两之间的空座位,当成选为一个个集合的话是非常好......
  • PKUWC2025 游记 & WC2025不游记
    Day???CSP出分后发现自己是276,T1爆零了。这是怎么回事呢?看了代码发现最开头多了个'n'。纯来搞笑的,这下去不了WC了。Day-1考前看了看各种板子,显然一个都没有考到。Day1食堂排了30分钟的队,懒得喷,还是APIO发盒饭更人性化。上来被T1硬控一小时只有10分,心态爆炸跑......
  • NOIWC2025 实录
    Day1报道日。前情提要:结束了PKUWC,前往龙山书院参加NOIWC。今天没有安排讲课,选择了一些经典的题目完成。[ABC387G]PrimeCircuit原题链接:https://atcoder.jp/contests/abc387/tasks/abc387_g简要题意:对于\(n\)个点、有标号、每个环长度均为奇质数的仙人掌计数。考虑Pr......
  • [20250117]记录下21c下使用gdb跟踪逻辑读遇到的问题.txt
    [20250117]记录下21c下使用gdb跟踪逻辑读遇到的问题.txt--//在21c下使用gdb跟踪逻辑读遇到的问题,困扰好几天,做一个记录。--//首先我以前写过1个gdb脚本跟踪逻辑读在11g下,使用遇到一些问题,发现21c下没有使用kteinpscan,kdifxs函数。--//我先注解这部分内容,测试看看。1.环境:SCOTT@boo......
  • 25.01.17
    A什么时候改一下不用脑子的毛病。音符的判定分相互独立且容易计算。考虑如何计算连击分。直接把\(\texttt{Perfect}\)和\(\texttt{Good}\)的概率求和记为\(a\),不连击记为\(c\)。枚举最长连击长度\(len\),记\(f_{i,j,0/1}\)表示前\(i\)个音符,当前连击\(j\)次,是......
  • C#数据结构与算法入门实战指南
    前言在编程领域,数据结构与算法是构建高效、可靠和可扩展软件系统的基石。它们对于提升程序性能、优化资源利用以及解决复杂问题具有至关重要的作用。今天大姚分享一些非常不错的C#数据结构与算法实战教程,希望可以帮助到有需要的小伙伴。C#经典十大排序算法主要讲解C#经典十大......
  • 关于函数(20250117)
    补充递归调用的补充:无限制的递归调用不会产生死循环,而是在栈区空间中,被调函数“入栈(保护现场)”产生的返回值地址占满整个栈区空间,程序直接崩溃。数组作为参数传递,传递的是数组的首元素地址。字符串数组的末尾存在‘\0’,因此字符串数组作为函数参数时,不需要元素个数作为函数参......
  • 2025年1月16日人工智能与科技新闻速递
    2025年已经来临,全球人工智能领域正在经历一场前所未有的技术浪潮。在这一年初,众多科技巨头纷纷发布新一轮的AI布局,展现出它们在人工智能领域的雄心和战略规划。从Google在英国市场推出AI概览功能,到Adobe的创新工具,再到EarthSpeciesProject的突破性生态保护应用,人工智能正......
  • 【算法】枚举
    枚举普通枚举1.铺地毯2.回文日期3.扫雷二进制枚举1.子集2.费解的开关3.EvenParity顾名思义,就是把所有情况全都罗列出来,然后找出符合题目要求的那一个。因此,枚举是一种纯暴力的算法。一般情况下,枚举策略都是会超时的。此时要先根据题目的数据范围来判断暴力枚举是否......