数据结构第二章课后习题第七题(逆转结点链接方向)

设计算法,通过一趟遍历,将链表中所有结点的链接方向逆转,仍利用原来的存储空间 



#include <iostream>
 
#define overflow -2
#define ok 1
#define error 0
 

using namespace std;
 
typedef int status;
typedef int ElemType;
 
//定义
typedef struct LNode
{
	ElemType data;           //数据域 
	struct LNode *next;      //指针域 
}LNode , *LinkList;

//初始化
status InitList(LinkList &LA)
{
    LA = new LNode;           //生成一个新结点 
	LA->next = NULL;	         //结点指针域置空
	return ok; 
} 
 
//创建一个长度为n的单链表 
status CreatList_R(LinkList &LA, int n)
{
    LNode *r = LA;                         //尾指针初始化指向头结点 
    for (int i = 0; i < n; i++)
    {
        LNode *p = new LNode;             //生成新结点 
        cin >> p->data;                   //输入的数据存放在新结点的数据域 
        
        r->next = p;
        p->next = NULL;
        r = p;
    }
    return ok;
} 


//输出
int DispList(LinkList L)
{
    LNode *p = L->next;
    while (p)
    {
        cout << p->data << ' ';
        p = p->next;
    }
    return ok;
}


//逆转结点链接方向 
/*----------------------------------------------*
分析: 
就相当于是将一个链表倒着输出 
从首元结点开始,逐个把链表L的当前结点p,插入新的链表头部 ,也就是头插法 
 
*------------------------------------------------*/

status Inverse(LinkList &L)
{  //逆置带头结点的单链表L 
	LNode *p = L->next;
	L->next = NULL;
	while (p)
	{
		LNode *q = p->next;                   //生成新结点指向p的后继结点
		p->next = L->next;
		L->next = p;                          //*p插在头结点之后 (头插法)
		p = q; 
	}
}


//主函数
int main()
{
	int n;
	LinkList L;
	InitList(L);
	cout << "输入元素个数:" ;
	cin >> n ;
	cout << endl;
	
	cout << "请输入线性表元素:" << ' ' ;
	CreatList_R(L, n);
	cout << endl;
	
	cout << "逆转之后的链表为 :"  ;
	Inverse(L);
	DispList(L); 
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值