题目:请编写单链表相邻结点逆置算法。例如,1234逆置之后为2143。12345逆置后为21435。
分析:单链表逆置只需要交换数据域即可。由题可知,需要分奇数个结点和偶数个结点。可以使用两个指针p和q;p在前,q在后,换两个数据域。
当为偶数个结点时,q-next为空,跳出即可。当为奇数个结点时,p->next为空时,跳出即可。
函数代码:
void Reverse(list H)
{
list p,q;ElemType temp;
if(H->next==NULL);//空链表
else{
p=H->next;
while(true)
{
if(p->next==NULL)break;//奇数个数据结点,退出条件
else q=p->next;
temp=p->data; //逆置
p->data=q->data;
q->data=temp;
if(q->next==NULL)break;//偶数个数据结点,退出条件
else p=q->next;
}
}
}
全部代码:
/*
题目:请编写单链表相邻结点逆置算法。例如,1234逆置之后为2143。12345逆置后为21435。
Project: single_linked_list_reverse (数据结构 单链表 相邻逆置)
Date: 2018/12/24
Author: Frank Yu
Reverse(list H):逆置函数 list类型单链表H
分析:单链表逆置只需要交换数据域即可。由题可知,需要分奇数个结点和偶数个结点。可以使用两个指针p和q;p在前,q在后,换两个数据域。
当为偶数个结点时,q-next为空,跳出即可。当为奇数个结点时,p->next为空时,跳出即可。
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Status int
#define ElemType int
//单链表结点数据结构
typedef struct node
{
ElemType data;//数据域
struct node *next;//指针域
}*list;
//**************************基本操作函数***************************//
//初始化函数
Status InitList(list &H)
{
H = new node;//生成头结点 这样删除等操作就不必分第一个结点和其他了
H->next = NULL;
return 1;
}
//获取单链表长度 头结点无数据,不算
int ListLength(list H)
{
list p=H;int sum=0;
while(p)
{
sum++;
p=p->next;
}
return sum-1;//去除头结点
}
//插入函数--后插法 插入到第i(1<=i<=length+1)个位置 即i-1之后 不必区分i的位置
bool ListInsert(list &H,int i,ElemType e)
{
node* s;list p=H;int j=0;
while(p&&(j<i-1))//j指到i-1位置
{
p=p->next;
++j;
}
if(!p||j>i-1)//i<1或者i>ListLength(H)+1时,插入位置无效 不调用ListLength,提高效率
{
printf("插入位置无效!!!\n");
return false;
}
s=new node;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
void Reverse(list H)
{
list p,q;ElemType temp;
if(H->next==NULL);//空链表
else{
p=H->next;
while(true)
{
if(p->next==NULL)break;//奇数个数据结点,退出条件
else q=p->next;
temp=p->data; //逆置
p->data=q->data;
q->data=temp;
if(q->next==NULL)break;//偶数个数据结点,退出条件
else p=q->next;
}
}
}
//**************************功能实现函数**************************//
//遍历输出函数
void PrintList(list H)
{
list p=H->next;//跳过头结点
if(ListLength(H))
{
printf("当前单链表所有元素:");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
else
{
printf("当前单链表已空!\n");
}
}
//插入功能函数 调用ListInsert后插
void Insert(list &H)
{
int place;ElemType e;bool flag;
printf("请输入要插入的位置(从1开始)及元素:\n");
scanf("%d%d",&place,&e);
flag=ListInsert(H,place,e);
if(flag)
{
printf("插入成功!!!\n");
PrintList(H);
}
}
//菜单
void menu()
{
printf("********1.插入 2.逆置*********\n");
printf("********3.输出 4.退出*********\n");
}
//主函数
int main()
{
list H;int choice;
InitList(H);//初始化
while(1)
{
menu();
printf("请输入菜单序号:\n");
scanf("%d",&choice);
if(choice==4) break;
switch(choice)
{
case 1:Insert(H);break;
case 2:Reverse(H);break;
case 3:PrintList(H);break;
default:printf("输入错误!!!\n");
}
}
return 0;
}
结果截图:
![](https://i-blog.csdnimg.cn/blog_migrate/7f6f996acd67564d225956bb2d08ce15.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f59c6c24fadb5d371d06082a32f8eab0.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/5931ce0d56abb91669769d79330e2d2d.jpeg)
更多数据结构实现:数据结构严蔚敏版的实现(含全部代码)
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。