通用链表----系统程序员成长计划 作业(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; }
相关文章推荐
- 系统程序员成长计划-并发(二)(上)
- 系统程序员成长计划-Don’t Repeat Yourself(DRY)(上)
- 系统程序员成长计划-管道过滤器(Pipe-And-Filter)模式
- 系统程序员成长计划-写得又快又好的秘诀(二)
- 系统程序员成长计划-写得又快又好的秘诀(二)
- 系统程序员成长计划-管道过滤器(Pipe-And-Filter)模式
- 系统程序员成长计划-拥抱变化(下)
- 系统程序员成长计划-写得又快又好的秘诀(二)
- 系统程序员成长计划-写得又快又好的秘诀(三)
- 系统程序员成长计划-拥抱变化(上)
- 系统程序员成长计划-写得又快又好的秘诀
- 系统程序员成长计划-写得又快又好的秘诀(五)
- 系统程序员成长计划-并发(一)(下)
- 系统程序员成长计划-写得又快又好的秘诀(四)
- 系统程序员成长计划-你的数据放在哪里(上)
- 系统程序员成长计划-并发(一)(上)
- 系统程序员成长计划-拥抱变化(上)
- 系统程序员成长计划-组合的威力
- 系统程序员成长计划-并发(二)(上)
- 与程序员朋友闲聊 通用权限管理系统有啥用?