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