链表逆序输出

程序功能:实现链表的就地逆序

程序主要思路:取链表中前三个结点,其中表头结点为空,不存放数据,用结构体指针 head 表示; 第二个结点
用 head->next 进行表示,第三个结点用结构体指针 p 表示。

操作:                                         效果:
head->next->next = NULL;                 令第二个结点的 next 指向 NULL,使第二和第三个结点断开
    
temp = p->next;                         

p->next = head->next;                   // B的next指向A

head->next = p;                         // head的next指向P

p = temp;                               // p后移

代码段:

//===============================================================
//Summary:
//          C语言 类 
//FileName:
//          C语言.c
//Remarks:
//          实现就地逆置
//Date:
//          2019/8/9 14:45
//Author:
//          张珂(1575595743@qq.com)
//Version:
//          1.0
//===============================================================
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct node
{
    ElemType data;      //定义字符串类型的data变量
    struct node *next;  //定义结构数组中的指针
}NODE;
//--------------------向链表中填入数据--------------------
void CreatFromTail(NODE* l)
{
    NODE *r, *s;
    char c;             //用来存放输入的字符 
    int flag = 1;       //设置一个标志,初始值为1;当输入"$"符号时,flag为0;建表结束
    r = l;              //r指针动态指向链表的当前表尾,以便做尾插入,其初值指向头结点
    while (flag)        //循环输入表中的元素值,将建立的新节点s插入表尾
    {
        c = getchar();  //获取输入字符
        if (c != '$')   //判断是否到达输入元素的终点; 没有到达,使用尾插法
        {
            s = (NODE *)malloc(sizeof(NODE));       //初始化新结点
            s->data = c;            //为结点赋值
            r->next = s;            //将新建s结点插在r结点(头结点)之后
            r = s;                  //r结点后移,r始终指向表尾
        }
        else            //元素已经全部插入
        {
            flag = 0;       //确定跳出循环的条件
            r->next = NULL;     //将最后一个结点的next链域置空,表示链表的结束
        }
    }
}
//--------------------链表取反--------------------      方法一
//void Reverse(NODE* head)
//{
//  NODE *pf = NULL, *temp = NULL, *pb = NULL;
//  pf = head;
//  if(head == NULL || head->next == NULL)      //当链表是空表,或是只有一个元素时,不需要进行逆序操作        
//      return ;
//  pb = pf->next;
//  head->next = NULL;          //将head结点从链表中分离出来
//  /*
//      head->  temp        ->      head  <-temp    
//      pf      pb                          pf      pb
//      
//      head特别指代头结点; temp是临时结点,每一次循环都会重新定义
//  */
//
//  while (pb != NULL)          //当pb存在时
//  {
//      temp = pb;              //保留原来的结点pb                         
//      pb = pb->next;          //pb指向下一结点
//      temp->next = pf;
//      pf = temp;              //pf指向下一结点
//  }
//}


//--------------------链表逆序--------------------
void Reverse(NODE * head)
{
    NODE *p, *temp;
    if (head->next == NULL || head->next->next == NULL) 
        return;
    /*          A           B               C           D   
        -       -           -              -            -   
        head    head->next  p               temp
    */
    p = head->next->next;
    head->next->next = NULL;        //断开A与B, p从B点往后移
    while (p != NULL)
    {
        temp = p->next;
        p->next = head->next;       //B的next指向A
        head->next = p;             //head的next指向P
        p = temp;                   //p后移
    }
}
//--------------------输出链表--------------------
void printLink(NODE* head)
{
    NODE *p = head->next;
    while (p != NULL)
    {
        printf("%c  ", p->data);
        p = p->next;
    }
}
int main()
{
    NODE* h;
    h = (NODE*)malloc(sizeof(NODE));
    h->next = NULL;
    printf("please enter some chars:\n");       //输入数据
    CreatFromTail(h);

    printf("The Link you created is :\n");      //打印输入的数据
    printLink(h);
    
    Reverse(h);     
    printf("\nAfter reverse, the link is :\n"); //打印逆置后的数据
    printLink(h);
    return 1;
}

参考文章:
https://blog.csdn.net/autumn20080101/article/details/7607148

https://blog.csdn.net/peng_apple/article/details/79614846

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容