精华内容
下载资源
问答
  • 次数据结构上机,在了模版的定义… 指针操作比较复杂,调试了很久???? 熟悉模版函数的定义方式 熟悉链表操作 邻居互换个无头结点的单链表,将相邻两个节点互换位置,返回修改后的链表。 例如 ...

    第二次数据结构上机,卡在了模版类的定义…
    指针操作比较复杂,调试了很久?

    • 熟悉模版类函数的定义方式
    • 熟悉链表操作

    邻居互换

    有一个无头结点的单链表,将相邻两个节点互换位置,返回修改后的链表。

    例如

    输入1->2->3->4,互换后返回2->1->4->3

    不可以通过修改链表节点内的值来实现。

    #include<iostream>
    using namespace std;
    
    template<class Type>
    class List;
    template<class Type>
    class Linknode{
    	friend class List<Type>;
    	public:
    		Linknode(){next=NULL;}
    		Linknode(const Type &value){
    			data=value;
    			next=NULL;
    		};
    	private:
    		Type data;
    		Linknode<Type> *next;
    }; 
    template<class Type>
    class List{
    	private:
    		Linknode<Type> *head;
    	public:
    		List();//构造函数 
    		~List(){};//析构函数 
    		bool insert(Type element); //尾插入
    		void show(); 
    		void showafter();
    		bool neighbourexchange();//交换相邻节点 
    };
    
    //构造函数
    template<class Type>
    List<Type>::List()
    {
        head=NULL;
     } 
    
    template<class Type>
    bool List<Type>::insert(Type element){
    	Linknode<Type>*newnode=new Linknode<Type>(element);
    	if(newnode==NULL){cerr<<"内存分配错误"<<endl;return false;}
    	Linknode<Type> *p=head;
    	if(!p) {head=newnode;return true;}
    	while(p->next!=NULL)
    	p=p->next;
    	p->next=newnode;
    	return true;
    }
    
    template<class Type>
    void List<Type>::show(){
    	Linknode<Type> *p=head;
    	if(head==NULL) cout<<"此为空链表"<<endl;
    	else {cout<<"输出链表:"<<endl;
    		for(;p;p=p->next)
    		cout<<p->data<<"  ";}
    	cout<<endl;
    }
    
    template<class Type>
    void List<Type>::showafter(){
    	Linknode<Type> *p=head;
    	if(head==NULL) cout<<"此为空链表"<<endl;
    	else {cout<<"输出邻居互换后链表:"<<endl;
    		for(;p;p=p->next)
    		cout<<p->data<<"  ";}
    	cout<<endl;
    }
    
    template<class Type>
    bool List<Type>::neighbourexchange(){
    	Linknode<Type> *q=head->next,*p,*r;
    	if(!q)  return false;
    	head->next=q->next;
    	q->next=head;
    	head=q;
    	if(!head->next->next) return false;
    	p=q->next;
    	q=p->next;
    	while(q->next)
    	{	r=q->next;
    	    if(r->next==NULL) {
    	    	r->next=q;
    	    	p->next=r;
    	    	q->next=NULL;
    	    	return true;
    		}
    		q->next=r->next;
    		r->next=q;
    		p->next=r;
    		p=q;
    		q=p->next;
    	}
    	return true;
    }
    int main()
    {   int n,i=0,x;
    	cout<<"输入链表节点个数:"<<endl;
    	cin>>n;
    	cout<<"请输入"<<n<<"个整数"<<endl;
    	List<int> num;
    	for(;i<n;i++)
    	{
    	cin>>x;
    	num.insert(x);
    	}
    	num.show();
    	num.neighbourexchange();
    	num.showafter();
    	return 0;
    }
    

    这题还是比较好写的,写清辅助指针的连接方式和奇数结束情况即可

     

    反转前k个节点

    有一个无头结点的单链表,将每k个节点反转顺序,返回修改后的链表。
    k是不大于链表长度的正整数,如果链表长度不是k的整数倍,则余下的节点保持顺序不变。

    例如

    链表1->2->3->4->5
    当k=2时,输出2->1->4->3->5
    当k=3时,输出3->2->1->4->5

    不可以通过修改链表节点内的值来实现。试着使程序仅使用常数级的空间复杂度

    #include<iostream>
    using namespace std;
    
    template<class Type>
    class List;
    template<class Type>
    class Linknode{
    	friend class List<Type>;
    	public:
    		Linknode(){next=NULL;}
    		Linknode(const Type &value){
    			data=value;
    			next=NULL;
    		};
    	private:
    		Type data;
    		Linknode<Type> *next;
    }; 
    template<class Type>
    class List{
    	private:
    		Linknode<Type> *head;
    	public:
    		List();//构造函数 
    		~List(){};//析构函数 
    		bool insert(Type element); //尾插入
    		void show(); 
    		void showafter(int k);
    		int listlength();//链表长度 
    		bool kreverse(int k,int length);//反转每k个结点 
    };
    
    //构造函数
    template<class Type>
    List<Type>::List()
    {
        head=NULL;
     } 
    
    template<class Type>
    bool List<Type>::insert(Type element){
    	Linknode<Type>*newnode=new Linknode<Type>(element);
    	if(newnode==NULL){cerr<<"内存分配错误"<<endl;return false;}
    	Linknode<Type> *p=head;
    	if(!p) {head=newnode;return true;}
    	while(p->next!=NULL)
    	p=p->next;
    	p->next=newnode;
    	return true;
    }
    
    template<class Type>
    void List<Type>::show(){
    	Linknode<Type> *p=head;
    	if(head==NULL) cout<<"此为空链表"<<endl;
    	else {cout<<"输出链表:"<<endl;
    		for(;p;p=p->next)
    		cout<<p->data<<" ";}
    	cout<<endl;
    }
    
    template<class Type>
    void List<Type>::showafter(int k){
    	Linknode<Type> *p=head;
    	if(head==NULL) cout<<"此为空链表"<<endl;
    	else {cout<<"每"<<k<<"个节点反转后链表:"<<endl;
    		for(;p;p=p->next)
    		cout<<p->data<<" ";}
    	cout<<endl;
    }
    
    template<class Type>
    int List<Type>::listlength(){
    	int len=0;
    	Linknode<Type> *p=head;
    	for(;p;p=p->next) 
    	len++;
    	return len;
    }
    
    template<class Type>
    bool List<Type>::kreverse(int m,int length){
    	if(m>length) {cout<<"反转节点数超过表长"<<endl<<endl;return true;}
    	if(m==1) return true;
    	Linknode<Type> *p=head,*q=p->next,*t=head,*h=head,*pp=head;
    	if(m==2&&length==2) {head=q;q->next=p;p->next=NULL;return true;}
    	int i=0,flag=1,headflag=1;
    	for(i=1;i<m&&h;i++)
    		h=h->next;//h指向下一组k个节点的起始位置 
    	while(h){
    		flag=1;
    		t=h->next;//t储存一组k节点的后继节点 
    		if(headflag==1) {head=h;headflag=0;}
    		for(i=0;i<m&&h;i++)
    		h=h->next;
    		while(q!=t&&q)
    		{   pp=q->next;
    			q->next=p;
    			if(flag==1)
    			{p->next=h?h:t;flag=0;}
    			if(p->next==t&&!h) 
    			{  p=q;q=pp;pp=q?q->next:NULL;
    				while(q!=t)
    				{q->next=p;p=q;q=pp;pp=q?q->next:NULL;}
    			    return true;}
    			p=q;q=pp;
    		}
    		if(!h)return true;
    		else {p=t;q=p->next;}
    	} 
    }
    int main()
    {   int n,i=0,x=0,k=0;
    	cout<<"输入链表节点个数:"<<endl;
    	cin>>n;
    	cout<<"请输入"<<n<<"个整数:"<<endl;
    	List<int> num;
    	for(;i<n;i++)
    	{
    	cin>>x;
    	num.insert(x);
    	}
    	num.show();
    	cout<<"请输入反转结点数:"<<endl;
        cin>>k;
        cin.sync();
    	num.kreverse(k,num.listlength());
    	num.showafter(k);
    	return 0;
    }
    

    130行代码它来了
    模版类链表定义照抄前一题,主要复杂在反转节点函数的写法

    思路
    简单情况单独考虑(k=1/只有两个节点)
    h记录下一组k个节点的起始位置(h为NULL则是最后一组反转,便于连接下一组k个节点的头指针)
    t保留一组k个节点的后继节点(便于处理之后链表长度不够需要返回的情况)
    工作指针p,q,pp依次向后轮转反向连接
    注意要先判断head的指向(可以直接判别)
    最重要的是处理防止访问空指针的问题:时刻注意判断NULL
    还有最后一步操作的分类讨论,调试了好久…
    写链表还是把思路理清楚,考虑到所有情况再写

    展开全文
  • java范例开发大全(pdf&源码)

    热门讨论 2013-07-04 13:04:40
    11.3 Date和Calendar 324 实例191 使用Date获取系统的当前时间 324 实例192 使用DateFormat获取系统的当前时间 325 实例193 使用GregorianCalendar获取系统的当前时间 326 实例194 使用SimpleDateFormat...
  • Java范例开发大全 (源程序)

    热门讨论 2011-04-27 07:47:22
     11.3 Date和Calendar 324  实例191 使用Date获取系统的当前时间 324  实例192 使用DateFormat获取系统的当前时间 325  实例193 使用GregorianCalendar获取系统的当前时间 326  实例194 使用...
  • 、Hexo Boot Hexo Boot 是基于 Spring Boot + MySQL 开发的一套开源的博客系统。前身是 ml-blog 博客系统,在此基础上演变和扩展而来。 、扩展功能 除了继承 ml-blog 中的功能(文章、分类、标签、全局参数)外...
  • java范例开发大全源代码

    热门讨论 2011-10-30 23:31:51
     11.3 Date和Calendar 324  实例191 使用Date获取系统的当前时间 324  实例192 使用DateFormat获取系统的当前时间 325  实例193 使用GregorianCalendar获取系统的当前时间 326  实例194 使用...
  • java范例开发大全

    2013-03-08 20:06:54
    11.3 Date和Calendar 324 实例191 使用Date获取系统的当前时间 324 实例192 使用DateFormat获取系统的当前时间 325 实例193 使用GregorianCalendar获取系统的当前时间 326 实例194 使用SimpleDateFormat...
  • excel的使用

    2012-11-25 17:06:01
    实际输入的时候,通常应用等差数列输入法,先输入前个值,定出自变量中数与数之间的步长,然后选中A2和A3两个单元格,使这项变成个带黑色边框的矩形,再用鼠标指向这黑色矩形的右下角的小方块“■”,当光标...
  • Java范例开发大全(全书源程序)

    热门讨论 2013-04-05 11:50:26
    11.3 Date和Calendar 324 实例191 使用Date获取系统的当前时间 324 实例192 使用DateFormat获取系统的当前时间 325 实例193 使用GregorianCalendar获取系统的当前时间 326 实例194 使用...
  • 、特有的记录导出功能,能满足你及时打印和文件格式互换的需求,让你随时随地轻松掌握你的银行交易记录. 三、及时更新的资产负债,让你也能轻松成为名专业家庭财务分析师. 四、信息中心---时时关注你的投资,...
  • 7.增加了单独对包厢和包厢类别的服务费设置,当后台参数设置为收取“服务费”时包厢设置的服务费才能起作用,三处服务费的优先级从高到低排列为:包厢信息设置(具体的每一个包厢)、包厢类别设置(对一类包厢的设置...
  • Java进制IO与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,进制,文件复制 Java进制IO与文件复制操作实例,好像是本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java进制IO与文件复制操作实例,好像是本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
  • 134_指针14_确定维数组需要2个参数及其原因_下 134_指针14_确定维数组需要2个参数及其原因_上 133_指针13_维数组名的含义 132_指针12_下标和指针的关系 131_指针11_维数组和指针关系概述 130_指针10...
  • 实例076 批量替换某一类字符串 实例077 把异常与错误信息显示到窗体中 实例078 从字符串中分离文件路径、文件名及扩展名 实例079 判断手机号的合法性 实例080 用字符串构建器追加字符 实例081 去掉字符串中的...
  • 实例076 批量替换某一类字符串 实例077 把异常与错误信息显示到窗体中 实例078 从字符串中分离文件路径、文件名及扩展名 实例079 判断手机号的合法性 实例080 用字符串构建器追加字符 实例081 去掉字符串中的...
  • 实例076 批量替换某一类字符串 实例077 把异常与错误信息显示到窗体中 实例078 从字符串中分离文件路径、文件名及扩展名 实例079 判断手机号的合法性 实例080 用字符串构建器追加字符 实例081 去掉字符串中的...
  • 实例076 批量替换某一类字符串 实例077 把异常与错误信息显示到窗体中 实例078 从字符串中分离文件路径、文件名及扩展名 实例079 判断手机号的合法性 实例080 用字符串构建器追加字符 实例081 去掉字符串中的...
  • 实例076 批量替换某一类字符串 实例077 把异常与错误信息显示到窗体中 实例078 从字符串中分离文件路径、文件名及扩展名 实例079 判断手机号的合法性 实例080 用字符串构建器追加字符 实例081 去掉字符串中的...
  • 实例076 批量替换某一类字符串 95 实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 实例079 判断手机号的合法性 99 实例080 用字符串构建器追加字符 100 实例081 去掉...
  • 实例076 批量替换某一类字符串 95 实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 实例079 判断手机号的合法性 99 实例080 用字符串构建器追加字符 100 实例081 去掉...
  • 实例076 批量替换某一类字符串 95 实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 实例079 判断手机号的合法性 99 实例080 用字符串构建器追加字符 100 实例081 去掉...
  • 实例076 批量替换某一类字符串 95 实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 实例079 判断手机号的合法性 99 实例080 用字符串构建器追加字符 100 实例081 去掉...
  • 实例151 不借助第3个变量实现两个变量互换 实例152 计算加权平均值 实例153 检查参数是否成功传递给用户自定义过程 实例154 使用递归过程实现阶乘运算 6.2 综合应用 实例155 制作改变窗体颜色的自定义过程 ...
  • 实例151 不借助第3个变量实现两个变量互换 实例152 计算加权平均值 实例153 检查参数是否成功传递给用户自定义过程 实例154 使用递归过程实现阶乘运算 6.2 综合应用 实例155 制作改变窗体颜色的自定义过程 ...
  • 参数为参照区域,第参数为颜色条件,第三参数为求和区域,即第参数中颜色与第参数相同,则将对应的第三参数的单元格进行求和。如果省略第三参数则对第参数求和 AVER评分函数。计算参数区域中去除最大值与...
  • EDB、高级表格、XLS互换.ec edb到html-1.0.ec EDB数据库客户端模块 1.0.ec edb 数据库转Excel模块 1.0.ec edb数据库转Excel模块 1.3.ec edb转xls.ec eOgre.ec errcode.ec EtfAPI.ec EtfAPI30.ec ETimeFly API模块.ec...
  • 1345个易语言模块

    2012-01-27 19:41:59
    EDB、高级表格、XLS互换.ec edb到html-1.0.ec EDB数据库客户端模块 1.0.ec edb 数据库转Excel模块 1.0.ec edb数据库转Excel模块 1.3.ec edb转xls.ec eOgre.ec errcode.ec EtfAPI.ec EtfAPI30.ec ETimeFly API模块.ec...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

一类卡二类卡互换