zoukankan      html  css  js  c++  java
  • 链表处理函数(自己总结)

    // LinkList.h: interface for the CLinkList class.
    //
    //////////////////////////////////////////////////////////////////////

    #if !defined(AFX_LINKLIST_H__DBA19BDD_A667_4BB6_8021_9EE13990ED41__INCLUDED_)
    #define AFX_LINKLIST_H__DBA19BDD_A667_4BB6_8021_9EE13990ED41__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    #include <stdio.h>


    #define OK 0;
    #define ERROR -1;

    typedef struct Link
    {
     Link* pNext;
     int   val;
    }*MyLink;

    class CLinkList 
    {
    public:
     CLinkList();
     virtual ~CLinkList();
     void Merge(Link* pHead1,Link* pHead2,Link** pNew);//非递减
     void CreateListForward(Link** L, int n, int* a);
     void CreateListBackward(Link** L, int n, int* a);
     int ListInsert(Link** L, int iPos, int a);
     int LocateEle(Link* L, int listLen, int a);
     int DeleteEle(Link** L, int iPos, int& e);
     void Reverse(Link* L);
     void output(Link *h);
    };


    -------------------------------------------------------
    --------------------------------------------------------
    // LinkList.cpp: implementation of the CLinkList class.
    //
    //////////////////////////////////////////////////////////////////////

    #include "LinkList.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    CLinkList::CLinkList()
    {

    }

    CLinkList::~CLinkList()
    {

    }

    void CLinkList::Merge(Link* pHead1,Link* pHead2,Link** pNew)//非递减
    {
     Link* pa;
     Link* pb;
     Link* pc;

     pa = pHead1;pb=pHead2;
     *pNew = pc = pHead1;//first make pNew point to pHead1

     while(pa && pb)
     {
      if(pa->val <= pb->val){//pa,pb都是本身就有的
       pc = (Link *)malloc(sizeof(Link));
       pc->pNext = pa;pc->val = pa->val;
       pc = pa; pa = pa->pNext;//pc前移
      }
      else{
       pc = (Link *)malloc(sizeof(Link));
       pc->pNext = pb; pc->val = pb->val;
       pc = pb; pb = pb->pNext;
      }
     }
     
     pc->pNext=pa?pa:pb;
    }

    void CLinkList::CreateListForward(Link** L, int n, int* a)//插入元素,表头前移.先插入的元素在表最后
    {
     Link* p;
     *L = (Link *)malloc(sizeof(Link));

     (*L)->pNext = NULL;
     for (int i=0;i<n;i++)
     {
      p = (Link *)malloc(sizeof(Link));
      p->val = a[i];
      p->pNext = (*L)->pNext; (*L)->pNext = p;//表头不断前移
      }
    }

    void CLinkList::CreateListBackward(Link** L, int n, int* a)//表头不断,先插入的在表最前,顺序插入
    {
     *L = NULL;
     Link* q;
     Link* p = NULL;

     for (int i=0; i<n;i++)
     {
      p = (Link *)malloc(sizeof(Link));
      p->val = a[i];
      if ((*L) == NULL) (*L) = p;
       else q->pNext = p;
      q = p; 
     }
     p->pNext = NULL;
    }

    //@Result:add a into the list before pos iPos
    //在位置iPos之前插入值a
    int CLinkList::ListInsert(Link** L, int iPos, int a)
    {
     Link* p;
     int j = 0;
     p = (*L);

     while (p && j < iPos-1)
     {
      p = p->pNext; ++j;
     }
     
     if (!p || j > iPos-1) return ERROR;
     
     Link* s = (Link *)malloc(sizeof(Link));
     s->val = a; s->pNext = p;
     p=s;//此时p指针和*L是不一样的
     *L = p;//此时s中就是插入后的从6-11
     return OK; 
    }

    //返回元素a的位置,没有则为返回0
    int CLinkList::LocateEle(Link* L, int listLen, int a)
    {
     int iPos = 1;
     Link* p;
     p = L;
     
     while (p && (p->val != a))
     {
      p = p->pNext;
      iPos++;
     }

     if (iPos <= listLen) return iPos;
      else return 0;
    }

    int CLinkList::DeleteEle(Link** L, int iPos, int& e)
    {//delete 第iPos个元素
     int j = 0;
     Link *p,*q;
     p = *L;

     while (p && j < iPos - 2)
     {
      p = p->pNext;
      j++;
     }

     if (!p->pNext || j> iPos -1)  return ERROR;
     q = p->pNext; p->pNext = q->pNext;
     e = q->val; free(q);
    // p->pNext = p->pNext->pNext;这样写p->pNext就取不到了
     

     return OK;
    }

    void CLinkList::Reverse(Link* L)
    {
     Link *p,*q = NULL;
      
     if (L == NULL) return;
     
     p = L->pNext;
     
     while (p != NULL)
     {
      L->pNext = q;
      q = L;
      L = p;
      p = p->pNext;
     }
     L->pNext = q;
    }

    void CLinkList::output(Link *h)
    {
     if(h!=NULL)
     {
      output(h->pNext);
      printf("%c",h->val);
     }
    }

  • 相关阅读:
    BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
    BZOJ 1565 Luogu P2805 [NOI2009]植物大战僵尸 (Tarjan判环、最小割)
    BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)
    BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析)
    BZOJ 2806 Luogu P4022 [CTSC2012]Cheat (广义后缀自动机、DP、二分、单调队列)
    Mongodb的聚合和管道
    Mongodb文档查询
    Mongodb的基本操作-数据库 集合 文档的增删改查
    Linux下Mongodb的安装
    mongdb的优势和不足
  • 原文地址:https://www.cnblogs.com/dayouluo/p/119261.html
Copyright © 2011-2022 走看看