数据结构——线性表逆转

本文详细探讨了数据结构中线性表的逆转过程,分别针对顺序存储结构和链式存储结构进行了分析。在顺序存储结构中,通过连续输入并以特定标记*结束的方式进行逆转;而在链式存储结构中,则利用原来的存储空间实现逆转操作。

顺序存储结构:

连续输入,以*结束

#include<iostream>
#include<cstdlib>
//顺序表结构类型定义
typedef char datatype;
const int maxsize=10;
typedef struct
{ datatype data[maxsize];
  int last;
}SqList,*Ptr;
void create(Ptr&);
void print(Ptr);
void invert(Ptr);

int main()
{
	Ptr L=NULL;
	//为什么要声明指针,不直接申明变量?
	//——这里要直接使用变量也可以,但是在后面
	//初始化顺序表就要取地址——还是指针(其实用引用传递也可以) 
	//所以一般就直接声明指针会更方便。 
	create(L);//建立顺序表
	print(L);//输出顺序表
	invert(L);//调用顺序表逆值的函数
	print(L);//输出顺序表
	return 0;
}

//建立顺序表
void create(Ptr&L)
{
	//注意 :初始化时候一定要将指针引用传递;
	//因为传值调用会再创建一个指针(b),和实参的值(a)相同,都是NULL,
	//b指向了一块开辟的空间,出了函数后,回到主函数,这块堆中的空间虽然不会像栈中一样被回收,
	//但是栈中的b已经不在了,a还是指向NULL,找不到这块空间 
	L=(SqList*)malloc(sizeof(SqList));
	L->last=0;
	char ch;
	while((ch=getchar())!='*')
	{   
		L->last++;
		L->data[L->last]=ch;
	}
}

//输出顺序表
void print(Ptr L)
{
	for(int i=1;i<=L->last;i++)
		printf("%2c",L->data[i]);
	printf("\n");
}

//顺序表逆置
void invert(Ptr L)
{
	int n=L->last/2;
	for(int i=1;i<=n;i++)
	{
		char temp=L->data[i];
		L->data[i]=L->data[L->last-i+1];
        L->data[L->last-i+1]=temp;
	}
}

链式存储结构:

使用原来的存储空间

#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node{
	ElementType Data;
	PtrToNode Next;
};

typedef PtrToNode List;
List Read();
void Print(List L);
List Reverse(List L);

int main() {
	List L1,L2;
	L1=Read();
	Print(L1);
	L2=Reverse(L1);
	
	Print(L2);
	return 0; 
} 
List Read(){
	List current,head=NULL,prev=NULL;
	int len=0;
	printf("Please input the length of chain:");
	scanf("%d",&len);
	if(len==0) return NULL;
	printf("Please input the figures:");
	while(len--){
		current=(List)malloc(sizeof(struct Node));
		scanf("%d",&current->Data);
		current->Next=NULL;
		if(head==NULL){
			head=current;
			prev=head;	
		}
		else{
			prev->Next=current;
			prev=current;
		}
	}
	return head;
}

void Print(List L){
	while(L){
		printf("%d",L->Data);
		L=L->Next;
	}
}

List Reverse(List L){
	if(L==NULL)
		return NULL;
	List p=NULL,q=NULL;
	while(L){
		q=L->Next;//p是旧链的第二个 
		L->Next=p;//断开旧链,链上新链 
		p=L;//新链的第一个是刚加入的旧链 
		L=q;//旧链的头更新 
	}
	return p; 
}















 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值