您的位置:首页 > 其它

链表处理函数(自己总结)

2005-03-15 19:38 453 查看
// 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);

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: