题目描述
根据一个递增的整数序列构造有序单链表,删除其中的重复元素
本题是附加代码模式,主函数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