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

/*
用 线性表 和 单链表 的 存储 结构,来实现 线性表的 转置
将线性表(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;
}
 

 

Guess you like

Origin blog.csdn.net/qq_47991812/article/details/120976240