zoukankan      html  css  js  c++  java
  • 单链表反转的图示操作

      有一个线性表$(a_1,a_2, cdots, a_n)$, 采用带头结点的单链表$L$存储,设计一个算法将其就地逆置。所谓“就地”指辅助空间为$O(1)$。

    解答:用$p$指针扫描原单链表,先将头结点$L$的$next$域置为$NULL$而变成一个空链表,然后,将$*p$结点采用头插法插入到$L$中。算法如下:

     1 void Reverse(LinkList *&L){
     2     LinkList *p=L->next,*q;
     3     L->next=NULL;
     4     while (p!=NULL)
     5     {
     6         q=p->next;
     7         p->next=L->next; //将*p结点插入到新建链表的前面
     8         L->next=p;
     9         p=q;
    10     }
    11 
    12 }

    上述算法的图示操作如下:

    //完整代码如下:

    //LinkBase.h
    #include <stdio.h>
    #include <malloc.h>
    typedef int ElemType;
    typedef struct LNode{
        ElemType data;
        struct LNode *next;
    }LinkList;
    
    void InitList(LinkList *&L){
        L=(LinkList *)malloc(sizeof(LinkList));
        L->next=NULL;
    }
    
    void DestroyList(LinkList *&L){
        LinkList *p=L, *q=p->next;
        while(q!=NULL){
            free(p);
            p=q;
            q=p->next;
        }
        free(p);
        
    }
    
    int ListLength(LinkList *L){
        LinkList *p=L;
        int i=0;
        while(p->next!=NULL){
            i++;
            p=p->next;
        }
        return i;
    }
    
    void DispList(LinkList *L){
        LinkList *p=L->next;
        while(p!=NULL){
            printf("%d ",p->data);
            p=p->next;
        }
        printf("
    ");
    
    }
    
    int GetElem(LinkList *L,int i,ElemType &e){
        int j=0;
        LinkList *p=L;
        while(j<i && p!=NULL){
            j++;
            p=p->next;
        }
    
        if (p==NULL)
        {
            return 0;
        }
        else{
            e=p->data;
            return 1;
        }
    
    }
    
    int LocateElem(LinkList *L,ElemType e){
        LinkList *p=L->next;
        int n=1;
        while (p!=NULL && p->data!=e)
        {
            p=p->next;
            n++;
        }
        if(p==NULL)
            return 0;
        else
            return n;
    
    }
    
    int ListInsert(LinkList *&L,int i,ElemType e){
        int j=0;
        LinkList *p=L,*s;
        while (j<i-1 && p!=NULL)
        {
            j++;
            p=p->next;
        }
        if(p==NULL)
            return 0;
        else{
            s=(LinkList *)malloc(sizeof(LinkList));
            s->data=e;
            s->next=p->next;
            p->next=s;
            return 1;
        }
    
    }
    
    int ListDelete(LinkList *&L,int i,ElemType &e){
        int j=0;
        LinkList *p=L,*q;
        while (j<i-1 && p!=NULL)
        {
            j++;
            p=p->next;
        }
        if(p==NULL)
            return 0;
        else{
            q=p->next;
            if(q==NULL) return 0;
            e=q->data;
            p->next=q->next;
            free(q);
            return 1;
    
        }
    
    }
    
    //主函数.cpp
    #include "LinkBase.h"
    #include <stdio.h>
    
    void Reverse(LinkList *&L){
        LinkList *p=L->next,*q;
        L->next=NULL;
        while (p!=NULL)
        {
            q=p->next;
            p->next=L->next; //将*p结点插入到新建链表的前面
            L->next=p;
            p=q;
        }
    
    }
    
    
    void main()
    {
        LinkList *Ls = (LinkList *)malloc(sizeof(LinkList));
        Ls->next=NULL;
        int i=0;
        for (i=1;i<10;i++)
        {
            ListInsert(Ls,i,i*i-1);
        }
    
        printf("原线性表:
    ");
        DispList(Ls);
    
        //ListInsert(Ls,3,15);
        Reverse(Ls);
        printf("反转后的线性表:
    ");
        DispList(Ls);
    
        free(Ls);
    }

    效果如下:

  • 相关阅读:
    MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐 级之间的区别?
    NOW()和 CURRENT_DATE()有什么区别?
    什么是非标准字符串类型?
    列的字符串类型可以是什么?
    实践中如何优化 MySQL ?
    可以使用多少列创建索引?
    数据库中的事务是什么?
    锁的优化策略?
    SQL 注入漏洞产生的原因?如何防止?
    强调事项段、其他事项段、关键审计事项
  • 原文地址:https://www.cnblogs.com/sanqima/p/4842531.html
Copyright © 2011-2022 走看看