头文件:
//////////////////////////////////////////////////////////////////////////
/* Author: bizhu12 */
/* Timer : 2011.07.02 */
/* 编译环境: VS2008 */
//////////////////////////////////////////////////////////////////////////
//创建线性链表
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#ifndef List_H_
#define List_H_
struct ListNode
{
int Data;
ListNode *pNext;
};
class List
{
public:
List();
ListNode* CreateList(int); //创建链表
void PrintList(ListNode *); //打印链表
int InsertNode(ListNode *,ListNode *,int); //插入节点成功返回1,否则0
ListNode* DeleteNode(ListNode *,int); //返回删除的节点,NULL为删除失败
int SortList(ListNode *); //线性链表排序,简单的选择排序
int DestroyList(ListNode *); //删除线性链表
private:
int NodeCount; //记录节点个数
};
#endif
Cpp文件:
// LinkList.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
List::List()
{
NodeCount = 0; //初始化
}
//创建链表
ListNode* List::CreateList(int count) //count是创建链表是需要指定节点个数
{
ListNode * pHead = NULL;
ListNode *p = new ListNode; //分配内存
memset(p,0,sizeof(ListNode)); //清空内存
ListNode *pTemp = pHead = p;
int i = 0;
cout << "输入" << count << "个数:" << endl;
while(i < count)
{
//头结点数据域为空的链表
p = new ListNode;
memset(p,0,sizeof(ListNode));
cin >> p->Data;
pTemp->pNext = p;
pTemp = p;
i++;
}
NodeCount = count;
return pHead; //返回头结点
}
void List::PrintList(ListNode * pHead)
{
if (pHead)
{
//头结点不为空
pHead = pHead->pNext;
cout <<endl <<"链表的值: ";
while(pHead) //节点为空时结束
{
cout << pHead->Data << " ";
pHead = pHead->pNext;
}
cout << endl;
}
else
return;
}
//插入节点
int List::InsertNode(ListNode *pHead,ListNode *Node,int Seat)
{
//Node 为要插入的节点,Seat为插入的位置
int i = 1;
if (pHead) //判断头结点是否为空
{
//判断插入的位置是否大于节点个数+1个;可以在最后插入,
//但不能在最后的最后一个位置(NodeCount+2)
if (Seat > NodeCount +1)
{
return 0; //如果>= 节点个数+2
}
ListNode *p = pHead;
//定位
while(i < Seat)
{
p = p->pNext;
i++;
}
//插入
Node->pNext = p->pNext;
p->pNext = Node;
NodeCount++; //节点个数+1;
return 1;
}
return 0;
}
//删除节点
ListNode * List::DeleteNode(ListNode *pHead,int Seat)
{
if (pHead)
{
int i = 1;
ListNode *pTemp = NULL;
ListNode *p = pHead;
if (Seat > NodeCount)
{
return NULL; //节点不存在则结束函数
}
//定位
while(i < Seat)
{
p = p->pNext;
i++;
}
//从链表中删除
pTemp = p->pNext;
p->pNext = pTemp->pNext;
NodeCount--; //节点个数减一
return pTemp; //返回删除的节点
}
return NULL;
}
//简单的选择排序,升序排序
int List::SortList(ListNode *pHead)
{
if(pHead)
{
ListNode *p = pHead;
ListNode *pTemp = NULL;
ListNode *Temp2 = new ListNode;
memset(Temp2,0,sizeof(ListNode));
p = p->pNext;
for ( ; p ; p = p->pNext)
{
for (pTemp = p->pNext; pTemp ; pTemp = pTemp->pNext )
{
if (p->Data > pTemp->Data)
{
//数据域交换数据
Temp2->Data = p->Data;
p->Data = pTemp->Data;
pTemp->Data = Temp2->Data;
}
}
}
return 1; //成功返回1
}
return 0; //否则0
}
//删除线性链表
int List::DestroyList(ListNode *pHead)
{
if (pHead)
{
ListNode *p = pHead;
ListNode *pTemp = pHead;
while(p)
{
p = p->pNext;
delete(pTemp);
pTemp = p;
}
pHead = NULL;
NodeCount = 0;
return 1; //成功返回1
}
return 0; //失败返回0
}