[链表练习1]实现链表的转置

使用链表创建时,使用前插法的时候,输入顺序跟输出顺序是相反的,因此请编写类的reverse成员函数,实现链表的转置,使其顺序与输入相同。

 测试输入期待的输出
测试用例1 2 0the result is:
1 2

代码:

 

#include <iostream>
#include <stdio.h>
#include<stdlib.h>
using namespace std;
class List; //前视定义,否则友元无法定义
class LinkNode
{        
 friend  class List; //链表结点类的定义
 private: 
   LinkNode *link; 
   int data;  
 public: 
   LinkNode (LinkNode *ptr = NULL)    {link=ptr;}
   LinkNode(const int & item, LinkNode *ptr = NULL){  data=item;link=ptr;} 
   ~LinkNode(){}; 
}; 

class List   
{//单链表类的定义
private:    
    LinkNode *first; //指向首结点的指针          
public:
    List (int x) { first = new LinkNode (x);}   // 带头结点
    ~List (){MakeEmpty();}         //析构函数
    void MakeEmpty ( );      //链表置空    
    void input(int  endTag);
	void reverse();
    void output();                  
}; 
void List:: MakeEmpty ( )
 { 
    LinkNode *q;
    while (  first->link != NULL ) 
	{q = first->link;  
     first->link = q->link;//将表头结点后第一个结点从链中摘下
     delete q;        //释放它 
    }
    
};	
 
void List :: input (int endTag){
	LinkNode  *newnode; int val;
	cin>>val;
	while(val!=endTag) 
	{
		newnode=new LinkNode (val);
		if (newnode==NULL)
             	{cerr<<"存储分配错误"<<endl;exit(1);}
  	    newnode->link=first->link;
		first->link=newnode;   
		cin>>val;  	
	}
} 

void List ::output ( )  {//依次输出各结点的值
LinkNode  *p=first->link; 
while(p!=NULL)    {
      cout<<p->data<<' ';
      p=p->link;
      }

cout<<endl;
}
     
     
int  main()
{
   List l(0);
    l.input(0);
    l.reverse ();
    cout<<"the result is:"<<endl;
    l.output ();
     return 1;
}
void List::reverse()
{
    LinkNode *temp,*temp0;
    if(first==NULL||first->link==NULL)
    {

    }
    else
    {
        temp=first->link;
        while(temp->link!=NULL)
        {
            temp0=temp->link;
            temp->link=temp0->link;
            temp0->link=first->link;
            first->link=temp0;
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值