线性表的各种题目,操作。

这篇博客介绍了如何在线性表,特别是单链表中进行逆置操作。提供了两种方法,一种是通过临时变量交换节点数据,另一种是改变指针方向。文章详细解释了第二种方法,并附带了带头结点的示意图及程序代码实现。
摘要由CSDN通过智能技术生成

1.有一个单链表的第一个节点指针为head,编写一个函数将该单链表逆置,即最后一个节点编程第一个节点,原来倒数第二个节点变成第二个节点,如此等等,在逆置中不能建立新的单链表。这里有两种方法,1、第一种是换数,即指针不变,只是用temp做中间变量,用temp=a;a=b;b=temp;形式把数换了。2、第二种时把指针换为逆向指针。

实现:

# include<iostream>    
# include "stdio.h"    
# include "stdlib.h"    
# include "malloc.h"
using namespace std;
typedef int elemtype;
typedef struct linknode
{
	elemtype data;
	struct linknode* next;
}nodetype,*linklist;

nodetype* create();
nodetype* invert(nodetype* h);
nodetype* find(nodetype* h,int i);
void output(nodetype* h);
int len(nodetype* h);


int main()
{
	nodetype* head;
	head=create();
	output(head);
	invert(head);
	output(head);
	return 0;
}

nodetype* create()
{
	nodetype*s,* la,*p;
	int x;
	cout << "输入x值,当x≠0时候,继续输入,0停止。" << endl;
	cin >> x;
	la=(nodetype *)malloc(sizeof(nodetype));
	s=p=la;
	while(x!=0)
	{
		s=(nodetype*)malloc(sizeof(nodetype));
		s->data=x;
		p->next=s;
		p=s;
		cin >> x;
	}
	cout << "结束" << endl;
	p->next=NULL;
	return la;
}

nodetype* invert(nodetype* h)
{
	int i,length,temp;
	nodetype* p,* q;
	length=len(h);
	for(i=1;i<(1+length)/2;i++)
	{
		p=find(h,i);
		q=find(h,length+1-i);
		temp=p->data;
		p->data=q->data;
		q->data=temp;
	}
	return h;
}

nodetype* find(nodetype* h,int i)
{
	int j;
	nodetype* p;
	p=h;
	for(j=0;j<i;j++)
	p=p->next;
	return p;
}

int len(nodetype* h)
{
	int i=0;
	nodetype* p;
	p=h;
	while(p->next!=0)
	{
		i++;
		p=p->next;
	}
	return i;
}

void output(nodetype* h)    
{    
    nodetype* q;    
    q=h->next;    
    while(q!=NULL)    
    {    
        cout << q->data <<  " ";    
        q=q->next;    
  
    }    
    cout << "end" << endl;    
    
}    
我在编写输出函数时候又犯错误,错误示例如下:

void output(nodetype* h)
{
	nodetype* p;
	p=h;
	while(p->next!=NULL)
	{
		cout << p->data << " " ;
		p=p->next;
	}
}


第二种如图(带头结点)

程序:

# include<iostream>    
# include "stdio.h"    
# include "stdlib.h"    
# include "malloc.h"

using namespace std;
typedef int elemtype;
typedef struct linknode{
	elemtype data;
	struct linknode* next;
}nodetype,*linklist; 

nodetype* create();
void output(nodetype* h);
nodetype* invert(nodetype* h);
int  len(nodetype *h);

void main()
{
	nodetype* head,*h;
	head=create();
	output(head);
	cout << "逆置后" << endl;
	head=invert(head);
	output(head);
}

nodetype* create()    
{    
    nodetype *r,*s,*la;    
    int x; 
    cout <<"输入0表示结束。" << endl;    
    cout << "输入结点值:" << endl;    
    cin >> x;    
    la=(linklist)malloc(sizeof(linknode));    
    r=s=la;    
    while(x!=0)    
    {       
        s=(linklist)malloc(sizeof(linknode));    
        s->data=x;    
        r->next=s;    
        r=s;    
        cout <<"输入结点值:" << endl;    
        cin >> x;    
    }    
    r->next=NULL;     
    return la;  
}    

void output(nodetype* h)    
{    
    nodetype* q;    
    q=h->next;
    while(q!=NULL)    
    {    
        cout << q->data <<  " ";    
        q=q->next;    
  
    }    
    
}    



int  len(nodetype *h)  
{  
    int i=0;  
    nodetype* p;  
    p=h;  
    while(p->next!=NULL) 
    { 
        p=p->next;  
        i++;  
    }  
    return i;  
}  
nodetype* invert(nodetype* h)
{
	nodetype* p,* q,* r,*ha;
	if(len(h)<=1)
	{
		cout << "逆置至少两个结点" << endl;
	}
	else
	
			p=h->next;
			q=p->next;
	{
		while(q->next!=NULL)
			{
			r=q->next;
			q->next=p;
			p=q;
			q=r;
			}
			q->next=p;
	}
	h->next->next=NULL;
	free(h);
	ha=(nodetype*)malloc(sizeof(nodetype));
	ha->next=q;
	return ha;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值