顺序表单链表-实现线性表就地转置

这篇博客介绍了如何使用线性表和单链表的存储结构来实现线性表的转置。针对单链表,通过交换结点的前后关系实现了就地逆置;对于数组形式的线性表,提供了两种不同的转置方法,分别是从两端向中间交换元素。这些方法均在常数辅助空间下完成操作。
摘要由CSDN通过智能技术生成

/*
用 线性表 和 单链表 的 存储 结构,来实现 线性表的 转置
将线性表(a0,a1,a2,......,an-1)就地逆置
即辅助 空间 O(1)
*/

/*
用 线性表 和 单链表 的 存储 结构,来实现 线性表的 转置 
将线性表(a0,a1,a2,......,an-1)就地逆置
即辅助 空间 O(1) 
*/

#include <stdio.h>
#include <malloc.h>
//单链表 
typedef struct node{
	
	int data;//data 值 
	struct node *next;//next
	
}node,*list;

//transpose linklist
void transpose_list(list &head)
{
	
	list p = head,s;
	head = NULL;
	
	while(p != NULL)
	{
		//把 现在的 头结点 取下来 
		s = p;
		p = p->next;//p指向 当前 头结点 的后一位 
		s->next = head;//然后 让s指向 之前取下来的结点,相当于 指向 原先的 前驱 结点, 
		//调转 next 指向前驱 
		head = s; //作为新 表的 头结点 
	} 
	
	return;
}

//存储 结构 为 线性表 的处理 
typedef struct Sqlist{
	int *elem;//data 数组 
	int length;//current length
}Sqlist;

//Sqlist_one
void transpose_Sqlist_one(Sqlist &L)
{
	
	int temp;
	//交换  类似与 双向链表 从两头 往中间 找 
	for(int i = 0;i < L.length / 2;i ++)//n为l.lenght 
	{
		
		temp = L.elem[i];
		L.elem[i] = L.elem[L.length - i - 1];
		L.elem[L.length - i - 1] = temp;
		
	}
	return;
}

//Sqlist_two
void transpose_Sqlist_two(Sqlist &L)
{
	int i = 0,j = L.length - 1,temp = 0;
	
	//类似与 双向链表 从两头 往中间 找 
	while(i < j)
	{
		temp = L.elem[i];
		L.elem[i] = L.elem[j];
		L.elem[j] = temp;
		
		i ++;j --;
	}
	return;;
}

void print_list(list L)
{
	
	L = L->next;
	printf("linklist :");
	while(L->data != NULL)
	{
		printf("%d  ",L->data);
		L = L->next;
	}
	
	return;
}

void print_Sqlist(Sqlist L)
{
	printf("Sqlist :");
	for(int i = 0;i < L.length;i ++)
	{
		printf("%d  ",L.elem[i]);
	}
	printf("\n");
	return;
}

//main 测试 函数 
int main()
{
	
	/******************linklist test**************************/
	
	list head,q;
	head->next = NULL;
    head->data = 0;

	int list_length = 10;
	q = head;
	while(list_length != 0)//赋值9 8 7 6 5 4 3 2 1 0 
	{
		list_length --;
		
		list p = (list)malloc(sizeof(node));//申请 结点 
		p->next = NULL;
		p->data = list_length;//构建 单链表 
		
		
		q->next = p;
		q = p;
	}
	
	transpose_list(head);//转置 单链表 
	
	print_list(head);//print
	//释放 申请的结点 空间(否则 可能 造成 打印 不出 ) 
	while(head != NULL)
	{
		head = head->next;
		delete head;
	}
	printf("\n");
	
	/******************linklist test**************************/
	
	//注意 两个测试 程序 不要 同时 运行 ,否则 可能 造成 其中一个 测试 函数打印 不出 值,两种 情况分别 测试 
	
	/******************Sqlist test**************************/
	/* 
	Sqlist L;
	L.length = 10;
	for(int i = L.length - 1;i >= 0;i --)//赋值 9 8 7 6 5 4 3 2 1 0 
	{
		L.elem[L.length - i - 1] = i; 
	}
	
	//transpose_Sqlist_one(L);//one method 转置 线性表 
	transpose_Sqlist_two(L);//two method 转置 线性表 
	
	print_Sqlist(L);
	
	/*****************Sqlist test***************************/
	
	return 0;
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值