• 单链表逆转


    参照:http://www.cnblogs.com/bluestorm/p/3167424.html

    getche()接收换行时会解析成‘ ’

    #include <stdio.h>
    #include <stdlib.h>
    struct list{
        char data;
        struct list *next;
    }node;
    struct list* input()
    {
        //p作为新结点,q不断连接新结点,h作为首结点返回
        struct list *p,*q,*h = NULL;
        while(1)
        {
            //新创建一个结点
            p = (struct list*)malloc(sizeof(node));
            scanf("%c",&p->data);
            p->next = NULL;
            if(p->data == '
    ')//此处不为'
    '
                break;
            if(h == NULL)
            {
                h = q = p;
            }
            else{
                q->next = p;
                q = p;
            }
        }
        return h;
    }
    void display(struct list* pfirst)
    {
        struct list *p = pfirst;
        while(p)
        {
            putchar(p->data);
            p = p->next;
        }
        puts("");
    }
    //1借助辅助空间
    //建立临时的新链表,将新结点指向其前驱结点实现逆转
    //struct list* reverse(struct list* Afirst)
    //{
    //    struct list *p,*h = NULL,*first = Afirst;
    //    while(first)
    //    {
    //        p = (struct list*)malloc(sizeof(node));
    //        p->data = first->data;
    //        if(h == NULL)//第一个结点
    //        {
    //            h = p;
    //            h->next = NULL;
    //        }
    //        else{
    //            p->next = h;
    //            h = p;
    //        }
    //        first = first->next;
    //    }
    //    return h;
    //}
    //2.头尾互换,指针指向反转
    struct list* reverse(struct list* Afirst)
    {
        struct list *p,*q,*h,*listen;
        p = listen = Afirst;
        q = NULL;
        //使listen指向最后一个结点
        while(listen->next)
            listen = listen->next;
        //p所指的结点始终串接在listen后面,q所指的结点则接在p后面,h则记住p在串接前的下一个结点
        while(p != listen)
        {
            h = p->next;
            listen->next = p;
            if(q == NULL)
            {
                q = p;
                q->next = NULL;
            }
            else{
                p->next = q;        
                q = p;
            }
            p = h;
        }
        return listen;
    }
    int main()
    {
        struct list *Afirst,*Bfirst;
        Afirst = input();
        puts("逆转前:");
        display(Afirst);
        Bfirst = reverse(Afirst);
        puts("逆转后:");
        display(Bfirst);
        return 0;
    
    }
  • 相关阅读:
    VSCode 设置 CPP 代码风格
    KiCad EDA 5.1.2 使用圆形板框时出现无法走线的问题
    oracle的sql优化
    mybatis 自动生成xml文件配置
    sql循环遍历
    XML
    oracle的concat的用法
    oracle 按某个字段查询重复数据
    Xshell 4的上传与下载
    Oracle之锁
  • 原文地址:https://www.cnblogs.com/emptyCoder/p/5180486.html
Copyright © 2020-2023  润新知