最近好忙,好长时间都没更新博客,唉,罪过罪过。
这次博客做一个练习题,是我们学校的C++练习题,题目如下:
问题描述:
1)实现链表的排序(升序)
2)实现两个有序链表的合并:A=A∪B,要求合并后仍然有序。
提交前请将所有的提示信息去掉,只保留最后的输出结果。例如运行时:从键盘直接输入:
2 1 2
3 1 2 3
输出结果为:
1
2
3
分别表示第一个链表元素个数为2,元素分别为 1,2 ;第二个链表元素个数为3,元素分别为1,2,3。
这个题比较简单,我用链表做的,有很多人说链表难,我觉得只要你弄懂了没有什么是难的。
链表需要一个链表类和一个节点类,链表由一个一个节点组成,每个节点的地址由系统随机生成,需要一个就加一个,节点的成员变量包括data(需要节点存储的数据)和link(下一个节点的头地址),这是单链表节点的特点,至于双链表各位朋友可以上网搜索,双链表和单链表的思想是一样的,只不过双链表多了一个头指针,用来指向上一个节点的地址。
这个题目比较简单,下面直接给出求解这个问题的完整代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
class List;
class LinkNode{//链表节点类
friend List;//定义List为友元类
public:
LinkNode *link;//用来存储下一个节点的地址
int data;//需要节点存储的数据
public:
LinkNode(const int & item,LinkNode *ptr=NULL){data=item;link=ptr;}//构造函数赋初值
LinkNode(LinkNode *ptr=NULL){link=ptr;}//函数重载
~LinkNode(){};//析构函数,释放节点内存
};
class List{//链表类
public:
LinkNode *first;//头指针
int da[1000]={0};
public:
List(){first = new LinkNode();}
~List(){MakeEmpty();}//析构函数,释放链表内存
void MakeEmpty();
void input(int node_number);
void Sort();
void output();
};
void List::MakeEmpty(){
LinkNode *q;
while(first->link!=NULL){
q= first->link;
first->link = q->link;
delete q;
}
}
void List::input(int node_number){
LinkNode *newnode;
int val;
for (int i=0;i<node_number;i++){
cin>>val;
da[i] = val;
newnode = new LinkNode(val);
newnode->link = first->link;
first->link = newnode;
}
}
void List::output(){
LinkNode *q;
q = first;
while(q->link!=NULL){
q = q->link;
q->link = q->link;
cout<<q->data<<endl;
}
cout<<endl;
}
void List::Sort(){
for(int i=0;da[i]!=0;i++){
for(int j=i+1;da[j]!=0;j++){
if(da[j]<da[i]){
int temp = da[i];
da[i] = da[j];
da[j] = temp;
}
}
}
}
int main()
{
List a,b;
int x,y,i,j;
int symbol=0;
cin>>x;//链表节点个数
a.input(x);
a.Sort();
cin>>y;
b.input(y);
b.Sort();
for(i=0;a.da[i]!=0;i++){
symbol = 0;
for(j=0;b.da[j]!=0;j++){
if(a.da[i]==b.da[j]){symbol=1;}
}
if (symbol==0){b.da[j]=a.da[i];}
}
b.Sort();
for(i=0;b.da[i]!=0;i++){cout<<b.da[i]<<endl;}
return 0;
}
sort函数按照节点所含的内容对节点进行排序。
在使用链式存储的时候,各位朋友记住绝对不能动first(即改变first的内容),否则会造成链表丢失,变成人工制造的垃圾。