分享
 
 
 

一个“链表”类,大家给点意见吧

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

下面是本人编写的一个“链表”类,大家给点意见吧。

首先是“链表”类的声明

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

*

* 文件名:CLinkList.h

*

* 功 能:声明链表类

*

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

#ifndef CLINKLIST_H_

#define CLINKLIST_H_

class CLinkList //链表类

{

public:

//一般构造函数、拷贝构造函数、赋值运算符、析构函数

CLinkList();

CLinkList(const CLinkList &rhs);

CLinkList& operator=(const CLinkList &rhs);

~CLinkList();

//插入

bool Insert(int position, const char *element); //在指定位置上添加节点

bool Insert(const char *beforeElem, const char *element); //在指定节点的前面添加节点

//删除

bool Delete(int position); //删除指定位置上的节点

bool Delete(const char *element); //删除指定节点

//修改

bool Update(int position, const char *element); //修改指定位置上的节点

bool Update(const char *oldElem, const char *newElem); //修改指定的节点为新的节点值

//查找

bool Search(const char *element, int &position); //返回指定节点在链表上的位置

bool Search(int position, char **element); //返回指定位置上的节点

bool Sort(void); //对链表进行排序操作(冒泡排序)

bool Display(void); //顺序显示链表中所有节点的元素值

inline void Count(int &nodeCount) //返回链表中所有节点的个数

{

nodeCount = m_count;

};

private:

struct Node //节点结构

{

struct Node *last; //指向前一个节点的指针

char *element; //节点元素

struct Node *next; //指向后一个节点的指针

};

struct Node *m_head; //链表的表头指针

int m_count; //节点的个数

};

#endif

///////////////////////////////////////////////////////////////////////

下面是“链表”类的实现

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

*

* 文件名:CLinkList.cpp

*

* 功 能:实现链表类的各种操作

*

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

#include <iostream>

#include "CLinkList.h"

using namespace std;

//一般构造函数

CLinkList::CLinkList()

:m_count(0),m_head(NULL)

{

m_head = new Node; //申请表头指针的内存空间

if (m_head != NULL) //申请成功

{

//初始化表头指针

m_head->last = NULL;

m_head->element = NULL;

m_head->next = NULL;

}

else //申请失败

{

m_head = NULL;

}

}

//拷贝构造函数

CLinkList::CLinkList(const CLinkList &rhs)

:m_count(0),m_head(NULL)

{

int len = 0;

//临时的节点指针

struct Node *temp = NULL;

struct Node *back = NULL;

m_head = new Node; //申请表头指针的内存空间

if (m_head != NULL) //申请成功

{

//初始化表头指针

m_head->last = NULL;

m_head->element = NULL;

m_head->next = NULL;

temp = rhs.m_head->next; //temp指向rhs所引用的CLinkList对象中的链表的第一个节点

if (temp != NULL) //rhs所引用的CLinkList对象中的链表不为空

{

back = new Node; //为本对象中的链表的第一个节点申请内存空间

if (back != NULL) //申请成功

{

m_head->next = back; //表头指针指向第一个节点

back->last = m_head; //第一个节点指向表头指针

//拷贝节点元素值

len = strlen(temp->element);

back->element = new char[len+1];

strcpy(back->element, temp->element);

back->next = NULL; //后继节点暂时为空

++m_count; //节点个数加1

//下一个节点

temp = temp->next; //temp指向rhs所引用的CLinkList对象中的链表的第二个节点

while (temp != NULL) //节点存在

{

back->next = new Node;

if (back->next != NULL) //内存申请成功

{

back->next->last = back; //指向前一个节点

back = back->next; //指向下一个节点

len = strlen(temp->element);

back->element = new char[len+1];

strcpy(back->element, temp->element);

back->next = NULL; //后继节点暂时为空

++m_count; //节点个数加1

temp = temp->next; //temp指向rhs所引用的CLinkList对象中的链表的下一个节点

}

else //内存申请失败

{

break;

}

} //end of while

} //end of if

} //end of if

}

else //申请失败

{

m_head = NULL;

}

}

//赋值运算符

CLinkList& CLinkList::operator=(const CLinkList &rhs)

{

int len = 0;

//临时的节点指针

struct Node *temp = NULL;

struct Node *back = NULL;

if (this != &rhs) //检查是否自赋值

{

//删除m_head指向的链表原有的所有节点

temp = m_head->next; //temp指向本对象中的链表的第一个节点

m_head->next = NULL;

while (temp != NULL)

{

back = temp->next; //保存下一个节点的指针值

delete [] temp->element; //释放节点元素值所占有的内存空间

delete temp; //释放节点所占有的内存空间

temp = back; //指向下一个节点

}

m_count = 0; //节点个数变为0

temp = NULL;

back = NULL;

//拷贝rhs所引用的CLinkList对象中的链表的所有节点到当前CLinkList对象中去

temp = rhs.m_head->next; //temp指向rhs所引用的CLinkList对象中的链表的第一个节点

if (temp != NULL) //rhs所引用的CLinkList对象中的链表不为空

{

back = new Node; //为本对象中的链表的第一个节点申请内存空间

if (back != NULL) //申请成功

{

m_head->next = back; //表头指针指向第一个节点

back->last = m_head; //第一个节点指向表头指针

//拷贝节点元素值

len = strlen(temp->element);

back->element = new char[len+1];

strcpy(back->element, temp->element);

back->next = NULL; //暂时没有后继节点

++m_count; //节点个数加1

//下一个节点

temp = temp->next; //temp指向rhs所引用的CLinkList对象中的链表的第二个节点

while (temp != NULL)

{

back->next = new Node;

if (back->next != NULL) //内存申请成功

{

back->next->last = back; //指向前一个节点

back = back->next; //指向下一个节点

len = strlen(temp->element);

back->element = new char[len+1];

strcpy(back->element, temp->element);

back->next = NULL;

++m_count; //节点个数加1

temp = temp->next; //指向下一个节点

}

else //内存申请失败

{

break;

}

} //end of while

} //end of if

} //end of if

} //end of if

return *this; //返回本对象的引用(一般用于链式的赋值)

}

//析构函数

CLinkList::~CLinkList()

{

//临时的节点指针

struct Node *temp = NULL;

struct Node *back = NULL;

if (m_head != NULL) //表头指针不为空

{

//删除m_head指向的链表中的所有节点

temp = m_head->next; //指向第一个节点

//释放表头指针所占有的内存空间

delete m_head;

m_head = NULL;

while (temp != NULL) //节点存在

{

back = temp->next; //保存下一个节点的指针值

delete [] temp->element; //释放节点元素值所占有的内存空间

delete temp; //释放节点所占有的内存空间

--m_count; //节点个数减1

temp = back; //指向下一个节点

}

} //end of if

}

//在指定位置上添加节点

bool CLinkList::Insert(int position, const char *element)

{

int index = 0;

int len = 0;

//临时的节点指针

struct Node *temp = NULL;

struct Node *back = NULL;

struct Node *newNode = NULL;

if ((position < 1) || (position > (m_count+1))) //指定的位置不正确

{

return false;

}

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

//链表为空,没有任何节点时

if (NULL == temp)

{

newNode = new Node; //为第一个节点申请内存空间

if (newNode != NULL) //内存申请成功

{

m_head->next = newNode; //表头指针指向第一个节点

newNode->last = m_head; //第一个节点指向表头指针

//拷贝节点元素值

len = strlen(element);

newNode->element = new char[len+1];

strcpy(newNode->element, element);

newNode->next = NULL; //没有后继节点

++m_count; //节点个数加1

return true;

}

else //内存申请失败

{

return false;

}

} //end of if

//在 1、1与m_count之间、m_count 位置上插入节点时

while (temp != NULL)

{

++index;

if (position == index) //找到匹配的位置

{

newNode = new Node; //为插入的节点申请内存空间

if (newNode != NULL) //内存申请成功

{

temp->last->next = newNode; //使前一个节点指向新创建的节点

newNode->last = temp->last; //使新创建的节点指向前一个节点

//拷贝节点元素值

len = strlen(element);

newNode->element = new char[len+1];

strcpy(newNode->element, element);

newNode->next = temp; //使新创建的节点指向该位置上原来的节点,即现在的下一个节点。

temp->last = newNode; //该位置上原来的节点(即现在的下一个节点)指向新创建的节点

++m_count; //节点个数加1

return true;

}

else //内存申请失败

{

return false;

}

} //end of if

back = temp; //保存前一个节点的指针

temp = temp->next; //指向下一个节点

} //end of while

//在位置 m_count+1 上插入节点时

newNode = new Node; //为插入的节点申请内存空间

if (newNode != NULL) //内存申请成功

{

back->next = newNode; //使前一个节点指向新创建的节点

newNode->last = back; //使新创建的节点指向前一个节点

//拷贝节点元素值

len = strlen(element);

newNode->element = new char[len+1];

strcpy(newNode->element, element);

newNode->next = NULL; //没有后继节点

++m_count; //节点个数加1

return true;

}

else //内存申请失败

{

return false;

}

}

else //表头指针为空

{

return false;

}

}

//在指定节点的前面添加节点

bool CLinkList::Insert(const char *beforeElem, const char *element)

{

int len = 0;

//临时的节点指针

struct Node *temp = NULL;

struct Node *newNode = NULL;

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (NULL == temp) //链表为空,没有任何节点

{

return false;

}

else //链表不为空

{

while (temp != NULL)

{

if (strcmp(beforeElem, temp->element) == 0) //找到匹配的节点

{

newNode = new Node; //为插入的节点申请内存空间

if (newNode != NULL) //申请成功

{

temp->last->next = newNode; //使前一个节点指向新创建的节点

newNode->last = temp->last; //使新创建的节点指向前一个节点

//拷贝节点元素值

len = strlen(element);

newNode->element = new char[len+1];

strcpy(newNode->element, element);

newNode->next = temp; //使新创建的节点指向下一个节点

temp->last = newNode; //使下一个节点指向新创建的节点

++m_count; //节点个数加1

return true;

}

else //内存申请失败

{

return false;

}

} //end of if

temp = temp->next; //指向下一个节点

}

return false; //找不到匹配的节点时返回false

}

}

else //表头指针为空

{

return false;

}

}

//删除指定位置上的节点

bool CLinkList::Delete(int position)

{

int index = 0;

struct Node *temp = NULL; //临时的节点指针

if ((position < 1) || (position > m_count)) //指定的位置不正确

{

return false;

}

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (temp != NULL) //链表不为空

{

while (temp != NULL)

{

++index;

if (position == index) //找到匹配的位置

{

temp->last->next = temp->next; //使前一个节点指向下一个节点

if (temp->next != NULL) //存在下一个节点

{

temp->next->last = temp->last; //使下一个节点指向前一个节点

}

//释放要被删除的节点所占用的内存空间

delete [] temp->element;

delete temp;

--m_count; //节点个数减1

return true;

}

temp = temp->next; //指向下一个节点

} //end of while

return false;

}

else //链表为空

{

return false;

}

}

else //表头指针为空

{

return false;

}

}

//删除指定节点

bool CLinkList::Delete(const char *element)

{

struct Node *temp = NULL; //临时的节点指针

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (temp != NULL) //链表不为空

{

while (temp != NULL)

{

if (strcmp(element, temp->element) == 0) //找到匹配的节点

{

temp->last->next = temp->next; //使前一个节点指向下一个节点

if (temp->next != NULL) //存在下一个节点

{

temp->next->last = temp->last; //使下一个节点指向前一个节点

}

//释放要被删除的节点所占用的内存空间

delete [] temp->element;

delete temp;

--m_count; //节点个数减1

return true;

} //end of if

temp = temp->next; //指向下一个节点

} //end of while

return false; //找不到匹配的节点时返回false

}

else //链表为空

{

return false;

}

}

else //表头指针为空

{

return false;

}

}

//修改指定位置上的节点

bool CLinkList::Update(int position, const char *element)

{

int index = 0;

int len = 0;

struct Node *temp = NULL; //临时的节点指针

if ((position < 1) || (position > m_count)) //指定的位置不正确

{

return false;

}

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (temp != NULL) //链表不为空

{

while (temp != NULL)

{

++index;

if (position == index) //找到匹配的位置

{

//释放原来节点元素值占有的内存空间

delete [] temp->element;

temp->element = NULL;

//拷贝新的节点元素值

len = strlen(element);

temp->element = new char[len+1];

strcpy(temp->element, element);

return true;

} //end of if

temp = temp->next; //指向下一个节点

} //end of while

return false;

}

else //链表为空

{

return false;

}

}

else //表头指针为空

{

return false;

}

}

//修改指定的节点为新的节点值

bool CLinkList::Update(const char *oldElem, const char *newElem)

{

int len = 0;

struct Node *temp = NULL; //临时的节点指针

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (temp != NULL) //链表不为空

{

while (temp != NULL)

{

if (strcmp(oldElem, temp->element) == 0) //找到匹配的节点

{

//释放原来节点元素值占有的内存空间

delete [] temp->element;

temp->element = NULL;

//拷贝新的节点元素值

len = strlen(newElem);

temp->element = new char[len+1];

strcpy(temp->element, newElem);

return true;

}

temp = temp->next; //指向下一个节点

} //end of while

return false; //找不到匹配的节点时返回false

}

else //链表为空

{

return false;

}

}

else //表头指针为空

{

return false;

}

}

//返回指定节点在链表上的位置

bool CLinkList::Search(const char *element, int &position)

{

int index = 0;

struct Node *temp = NULL; //临时的节点指针

position = 0;

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (temp != NULL) //链表不为空

{

while (temp != NULL)

{

++index;

if (strcmp(element, temp->element) == 0) //找到匹配的节点

{

position = index; //返回指定节点的正确位置

return true;

}

temp = temp->next; //指向下一个节点

} //end of while

return false; //找不到匹配的节点时返回false

}

else //链表为空

{

return false;

}

}

else //表头指针为空

{

return false;

}

}

//返回指定位置上的节点元素

bool CLinkList::Search(int position, char **element)

{

int index = 0;

int len = 0;

struct Node *temp = NULL; //临时的节点指针

if ((position < 1) || (position > m_count)) //指定的位置不正确

{

return false;

}

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (temp != NULL) //链表不为空

{

while (temp != NULL)

{

++index;

if (position == index) //找到匹配的位置

{

//返回找到的节点元素值

strcpy(*element, temp->element);

return true;

} //end of if

temp = temp->next; //指向下一个节点

} //end of while

return false;

}

else //链表为空

{

return false;

}

}

else //表头指针为空

{

return false;

}

}

bool CLinkList::Sort(void) //对链表进行排序操作(冒泡排序)

{

int len = 0;

char *tempElem = NULL;

//临时的节点指针

struct Node *temp = NULL;

struct Node *back = NULL;

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (temp != NULL) //链表不为空

{

while (temp != NULL)

{

back = temp->next; //back 指向 temp 所指向的节点的下一个节点

while (back != NULL)

{

//temp->element 大于 back->element,两个节点元素之间交换

if (strcmp(temp->element, back->element) > 0)

{

//拷贝temp->element所指向的节点元素值到tempElem所指向的内存空间中去

len = strlen(temp->element);

tempElem = new char [len+1];

strcpy(tempElem, temp->element);

delete [] temp->element;

temp->element = NULL;

len = 0;

//拷贝back->element所指向的节点元素值到temp->element所指向的内存空间中去

len = strlen(back->element);

temp->element = new char [len+1];

strcpy(temp->element, back->element);

delete [] back->element;

back->element = NULL;

len = 0;

//拷贝tempElem所指向的节点元素值到back->element所指向的内存空间中去

len = strlen(tempElem);

back->element = new char [len+1];

strcpy(back->element, tempElem);

delete [] tempElem;

tempElem = NULL;

len = 0;

} //end of if

back = back->next; //back 指向下一个节点

} //end of while

temp = temp->next; //temp 指向下一个节点

} //end of while

return true; //排序完成就返回true

}

else //链表为空

{

return false;

}

}

else //表头指针为空

{

return false;

}

}

//顺序显示链表中所有节点的元素值

bool CLinkList::Display(void)

{

struct Node *temp = NULL; //临时的节点指针

if (m_head != NULL) //表头指针不为空

{

temp = m_head->next; //指向第一个节点

if (NULL == temp) //链表为空

{

return false;

}

//顺序输出各节点的元素值

while (temp != NULL)

{

cout << temp->element << '\t';

temp = temp->next; //指向下一个节点

}

cout << endl;

return true;

}

else //表头指针为空

{

return false;

}

}

///////////////////////////////////////////////////////////////////////////

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有