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

posted on 2005-03-15 19:38  dayouluo(.Net学生)  阅读(561)  评论(0编辑  收藏  举报