您的位置:首页 > 职场人生

通用链表----系统程序员成长计划 作业(1)

2012-06-21 16:51 239 查看
View Code

// 通用双链表.cpp : 定义控制台应用程序的入口点。
//
/*********************************************

设计者:cslave
设计日期:2012.6.21

免责申明:本代码免费使用用,但是导致的任何问题,
本人概不负责。

通用双链表实现方法。

*********************************************/

#include "stdafx.h"
#include <iostream>
using namespace std;
typedef struct _DListNode
{
struct _DListNode* prev;
struct _DListNode* next;
void*  Data;
}DListNode;

template <typename ElemType>
DListNode* NewNode(ElemType* e)
{
DListNode* pNode=(DListNode*)malloc(sizeof(struct _DListNode));
pNode->Data=e;
pNode->next=NULL;
pNode->prev=NULL;
return pNode;
}

template<typename ElemType>
void InsertNode(DListNode* Head,ElemType* e)
{
if(Head==NULL)
{
Head=NewNode(e);
return;
}

DListNode* NodeTmp=Head;
while(NodeTmp->next!=NULL)
{
NodeTmp=NodeTmp->next;
}
DListNode* pNodeTmp=NewNode(e);
pNodeTmp->next=NULL;
NodeTmp->next=pNodeTmp;
pNodeTmp->prev=NodeTmp;
return;
}
//删除第一个=e的值
template<typename ElemType>
DListNode* DeleteNode(DListNode* Head,ElemType* e)
{
if(Head==NULL)
{
cerr<<"List Was Empty!"<<endl;
return Head;
}
if(Head->Data==e)
{

Head->next->prev=NULL;
Head=Head->next;
return Head;
}
DListNode* NodeTmp=Head;
DListNode* NodePrev=NULL;
while( NodeTmp->Data!=e&&NodeTmp->next!=NULL)
{
NodePrev=NodeTmp;
NodeTmp=NodeTmp->next;

}
NodePrev->next=NodeTmp->next;
if(NodeTmp->next!=NULL)
NodeTmp->next->prev=NodePrev;

delete NodeTmp;
return Head;
}

template<typename ElemType>
int FindElem(DListNode* Head ,ElemType* e)
{
DListNode *pNode=Head;
if(Head==NULL)
return -1;
int Counter=0;
while(pNode!=NULL&& pNode->Data !=e)
{
Counter++;
pNode=pNode->next;
}
if( pNode!=NULL&&pNode->Data==e)
return Counter;
else
return -1;
}

//删除所有的=e的元素
template<typename ElemType>
DListNode* DeleteNodeAll(DListNode* Head,ElemType* e)
{
if(Head==NULL)
{
cerr<<"List Was Empty!"<<endl;
return Head;
}
if(Head->Data==e)
{

Head->next->prev=NULL;
Head=Head->next;
return Head;
}
DListNode* Temp=NULL;
DListNode* NodeTmp=Head;
DListNode* NodePrev=NULL;
while(NodeTmp->next!=NULL)
{
while( NodeTmp->Data!=e&&NodeTmp->next!=NULL)
{
NodePrev=NodeTmp;
NodeTmp=NodeTmp->next;
}
NodePrev->next=NodeTmp->next;
if(NodeTmp->next!=NULL)
NodeTmp->next->prev=NodePrev;
Temp=NodeTmp;
NodeTmp=NodeTmp->next;
delete Temp;
}
return Head;
}

template<typename ElemType>
ElemType FindMaxValue(DListNode* Head)
{
DListNode* NodeTmp=Head;
ElemType* Max=(ElemType *)Head->Data;
while(NodeTmp!=NULL)
{
ElemType* Temp=(ElemType* )NodeTmp->Data;
if(*Temp>*Max) //注意这里要重载 >
*Max=*Temp;
NodeTmp=NodeTmp->next;
}
return *Max;
}

int _tmain(int argc, _TCHAR* argv[])
{
int arr[5]={1,8,3,4,5};

DListNode* Head=NewNode<int>(&arr[0]);
int *p=(int *)(Head->Data);
for(int i=1;i<5;i++)
InsertNode<int>(Head,&arr[i]);
Head= DeleteNode<int>(Head,&arr[2]);
cout<<" FindElem="<<FindElem<int>(Head , &arr[3])<<endl;
cout<<"FindMaxValue="<<FindMaxValue<int>(Head)<<endl;
cout<<*p<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: