这里算是比较简单的问题,在创建的一个单链表中,需要把偶数放到L中,奇数放到L1中。
思想:①需要各建立一个尾结点,这样才能知道什么时候结束。
② 需要进行遍历。这个跟书上讲的不同,书上主要是对一个已知的表进行分开。所以我们输入的这个值的奇偶性不知道,就要进行判断。
③尾指针最后是要置空的,不然不能结束。
以下是主要运用的函数:
template<typename T>
//这里使用的是普通函数,不是成员函数
void split(Linklist<T>&L,LinkList<T>&L1)
{
LNode<T>*p,*r1,*r2;
p = L.GetHead()->next;
r1 = L.GetHead();//这个指向L的头指针,因为头指针为私有
r2 = L1.GetHead();
while(p!=NULL)// 不能写p->next!=NULL,因为这样的话有可能末尾的那个值是进不了这个循环的
{
if(p->data%2==0)//如果是偶数,放到L中
{
r1->next = p;
r1 = p;
}
else
{
r2->next = p;
r2 = p;
}
p = p->next;//将p向后移。
}
r1->next=NULL;//将链表结束,不然没有值
r2->next=NULL;//将链表结束。
}
这是调试结果:
以下是源代码:
#include<iostream>
using namespace std;
template <typename T>
struct LNode {
T data; //数据域
LNode* next;//指向后继结点的指针域
};
template<typename T>
class LinkList {
public:
LinkList<T>();//构造函数,创建一个空单链表
~LinkList<T>();//析构函数,销毁单链表
void CreateListRear();//尾插法建立单链表
void DispList();//输出单链表的所有结点值
void sort();//排序
void DispList(LNode<T>* head);
LNode<T>* GetHead() {
return head;
}
private:
LNode<T> * head;//单链表的头结点指针
};
//实现成员函数
template<typename T>
LinkList<T>::LinkList()
{
head=new LNode<T>;
head->next=NULL;
}
template<typename T>
LinkList<T>::~LinkList()
{
LNode<T>*pre,*p;
pre = head;
p = head->next;
while(p!=NULL)
{
delete pre;
pre = p;
p = p->next;
}
delete p;
}
template<typename T>
void LinkList<T>::CreateListRear()
{
//使用尾插法
LNode<T>*r, *p;
r = head;
int n;
while(cin >> n&&n!=-1)
{
p = new LNode<T>;
p->data = n;
p->next = NULL;
r->next = p;
r = p;
}
}
template<typename T>
void LinkList<T>::DispList()
{
LNode<T>*p;
p = head->next;
while(p!=NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//排序
template<typename T>
void LinkList<T>::sort()
{
LNode<T>*pre,*p,*q;
pre = head;
p = head->next->next;
head->next->next = NULL;
while(p!=NULL)
{
q = p->next;
while(pre->next!=NULL&&pre->next->data<p->data)
{
pre = pre->next;
}
p->next = pre->next;
pre->next = p;
p = q;
}
}
//将偶数放在L中,将奇数放在L1中
template<typename T>
void split(LinkList<T>&L,LinkList<T>&L1)
{
LNode<T>*p,*r1,*r2;
p = L.GetHead()->next;
r1 = L.GetHead();
r2 = L1.GetHead();
while(p!=NULL) //不能写p->next!=NULL,因为这样的话有可能末尾的那个值是进不了这个循环的
{
if(p->data%2==0)
{
r1->next = p;
r1 = p;
}
else
{
r2->next = p;
r2 = p;
}
p = p->next;
}
r1->next=NULL;//将链表结束,不然没有值
r2->next=NULL;//将链表结束。
}
int main()
{
LinkList<int>L,L1;
L.CreateListRear();
L.DispList();
//L.sort();
//increase_list(L);
split(L,L1);
L.DispList();
L1.DispList();
}
适合小白学习哟!