顺序表、单链表元素逆置

单链表逆置操作要求不创建新节点,直接完成逆置操作。


#include <stdio.h>
#include <stdlib.h>
#define max 5

typedef struct list
{
	int data[max];
	int length;
	
}sqlist;

typedef struct node
{
	int data;
	struct node *next;
}Node,*Linklist;

sqlist initlist (sqlist L);

void reverse (sqlist L);

void print(sqlist L);

Linklist initlinklist(Linklist L);

void reverselist(Linklist L);

void printlist(Linklist L);

void main()
{
	sqlist L;
	L=initlist(L);
	reverse(L);
	//	reverse(initlist(L));
	Linklist L2;
	L2=initlinklist(L2);
	reverselist(L2);
}

sqlist initlist (sqlist L)

{
	for (int i=0;i<max;i++)
	{
		printf("请输入顺序表元素值  ");
		scanf("%d",&L.data[i]);
	}
	L.length=max;
	printf("顺序表构造结束\n");
	print(L);
	
	return L;
}

void reverse (sqlist L)
{
	int i,j,temp;
	i=0;
	j=L.length-1;
	while (i<j)
	{
		temp=L.data[i];
		L.data[i]=L.data[j];
		L.data[j]=temp;
		i++;
		j--;
	}
	print(L);
}
void print(sqlist L)
{
	printf("调用打印函数,当前顺序表状态如下:\n");
	for (int i =0;i<L.length;i++)
	{
		printf (" %d ",L.data[i]);
	}
	printf("\n");
}


Linklist initlinklist(Linklist L)
{
	Linklist p;
	Linklist q;
	Linklist f;
	L=(Linklist)malloc(sizeof(Node));
	int counter=0;
	for (int i=0;i<max;i++)
	{
		p=(Linklist)malloc(sizeof(Node));
		printf("输入单链表节点值:  ");
		scanf("%d",&p->data);
		counter++;
		if (counter==1)	
		{
			q=p;
			f=p;
		}
		else 
		{
			f->next=p;
			f=f->next;
		}
	}
	p->next=NULL;
	L->next=q;
	printf("单链表创建结束\n");
	printlist(L);//打印初始状态下的链表
	return L;
}


void reverselist(Linklist L)
{
	Linklist p,q;
	p=L->next;
	q=p->next;
	L->next=NULL;
	while(p!=NULL)
	{
		p->next=L->next;//断旧链,接新链
		L->next=p;//头结点后继接入
		p=q;
		if(q!=NULL)	
			q=q->next;
		if (q==NULL&&p==NULL)
			break;
	}
	printf("逆置结束\n");
	printlist(L);
}

void printlist(Linklist L)
{
	printf("调用打印函数,当前状态如下:\n");
	for (int i=0;i<max;i++)
	{
		L=L->next;
		printf(" %d ",L->data);
	}
	printf("\n");
	
}











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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值