题目:请编写单链表相邻结点逆置算法。例如,1234逆置之后为2143。12345逆置后为21435。
分析:单链表逆置只需要交换数据域即可。由题可知,需要分奇数个结点和偶数个结点。可以使用两个指针p和q;...
题目:请编写单链表相邻结点逆置算法。例如,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;
}
结果截图:
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。


