单链表中,将L中放入偶数,将L1放入奇数。

这里算是比较简单的问题,在创建的一个单链表中,需要把偶数放到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(); 
 }

 适合小白学习哟!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值