需求分析 要求使用单链表(不能用双向链表)使用头插法或尾插法来构建单链表,并在构建后可以把相同的结点删除只保留一个并且删除第一个最大的结点。
实现细节 因为要比较大小,故可以使用字符型来构建链表的储存的数据类型,比较的时候会自动比较字符对应的ASCII码表,固可以实现所有字符的大小比较而不会受限制。因为程序受单链表的限制,找到对应结点不方便对其进行删除操作,因而要找到该结点对应的前置结点才方便操作。
详细代码
#include<iostream>
using namespace std;
typedef char elemtype;
typedef struct Lnode{
elemtype data;
struct Lnode *next;
}Lnode,*LinkList;
void Creat_LinkList(LinkList &L,int n ){
L=new Lnode;
L->next=NULL;
LinkList r = L;
for(int i=0;i<n;i++){
LinkList p;
p=new Lnode;
cin>>p->data;
p->next = NULL;
r->next=p;
r=p;
}
cout<<"带头结点的单链表创建成功!\n";
}
void Display_LinkList(LinkList L){
LinkList p=L->next;
while(p){
cout<<p->data;
p=p->next;
}
}
void Delete_thesame(LinkList &L){
LinkList s,r;
s=L->next;
r=s;
while(s){
while(r->next){
if(r->next->data==s->data){
LinkList a=r->next;
r->next=r->next->next;
delete a;
}else{
r=r->next;
}
}
s=s->next;
r=s;
}
s=r=NULL;
delete s,r;
}
void Delete_thefirmax(LinkList &L){
LinkList m;
LinkList p = L;
m=L;
while(p->next){
if(p->next->data >m->next->data){
m=p;
p=m->next;
}else{
p=p->next;
}
}
LinkList a = m->next;
m->next=m->next->next ;
delete a;
}
int main(){
int i ;
cout<<"输入单链表的长度:";
cin>>i;
LinkList L;
cout<<"请输入单链表:";
Creat_LinkList(L,i) ;
cout<<"单链表为:";
Display_LinkList(L);
cout<<endl;
cout<<"删除相同的结点后的单链表为:";
Delete_thesame(L);
Display_LinkList(L);
cout<<endl;
cout<<"删除第一个最大结点后的单链表为:";
Delete_thefirmax(L);
Display_LinkList(L);
return 0;
}
下面附上运行结果:
|