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);
     }
    }

  • 相关阅读:
    【自然框架】终于把源码弄到git上了。
    js的动态加载、缓存、更新以及复用(四)
    ajax的再次封装!(改进版) —— new与不 new 有啥区别?
    ajax的再次封装!
    js的动态加载、缓存、更新以及复用(三)
    js的动态加载、缓存、更新以及复用(二)
    js的动态加载、缓存、更新以及复用(一)
    以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)
    以【联动列表框】来看单一职责!
    CPU 多核指令 —— WFE 原理【原创】
  • 原文地址:https://www.cnblogs.com/dayouluo/p/119261.html
Copyright © 2011-2022 走看看