栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言:顺序表逆转

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言:顺序表逆转

1、设计一个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求算法空间复杂度为O(1)。


定义三个指针分别为:new,old,temp;new指向头结点L的下一个元素,old指向new的下一个元素,temp指向old下一个元素(防止old指向new后,temp指向的数据丢失),然后开始逆转:①(old的next从temp改成new,然后三个指针全部往后退一个元素 ),在继续循环重复①操作,当Temp==NULL,停止循环,然后再做一次①操作,之后头结点L的下一个元素,就是最开始的new,指向temp(NULL),让它变成尾,再将头L连接最后一个数old,让尾变成头。


代码如下:
#include
#include

typedef struct List {
	int data;
	List* next;
}List,*Zlist;

void Xj_List(Zlist &L) {   //创建
	L = (Zlist)malloc(sizeof(int));
	L->next = NULL;
	if (!L) {
		printf("头结点未被创建!n");
	}
	printf("头结点创建成功!n");
	
}

void Cr_List(Zlist& L) {    //插入
	List* p = L;
	List* s ;
	int e,n=0;
	while (n != 5) {
		printf("插入的数据:");
		scanf("%d", &e);
		printf("n");
		s = (Zlist)malloc(sizeof(int));
		s->next = NULL;
		s->data = e;
		s->next = p->next;
		p->next = s;
		p = s;
		n++;
	}
}

void Pr_List(Zlist L) {      //输出
	List* p = L;
	while (p->next != NULL) {
		p = p->next;
		printf("%2d", p->data);
	}printf("n");
}

void Fz_List(Zlist &L) {      //逆转
	Zlist New, Old, Temp;
	New = L->next;
	Old = L->next->next;
	Temp = L->next->next->next;
	while (Temp!=NULL) {
		Old->next = New;
		New = Old;
		Old = Temp;
		Temp = Temp->next;
	}
	Old->next = New;
	L->next->next = Temp;
	L->next = Old;
}

int main() {
	Zlist L;
	int e;
	Xj_List(L);
	Cr_List(L);
	printf("前:n");
	Pr_List(L);
	Fz_List(L);
	printf("后:n");
	Pr_List(L);
	return 0;
}

运行结果:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352382.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号