终于有时间来复习复习数据结构了,使用的教材是《c++数据结构与算法》第四版,下面是在复习过程中一些简单的实现,权当练手的笔记和温习吧。可能有疏漏之处,还望见谅和指出,在此谢过 O(∩_∩)O~
下面把代码贴出来,其中有很详细的注释,在CodeBlocks中编译通过
在IntSLLish.h头文件中定义了链表节点IntSLLNode和链表IntSLList,其中head和tail分别指向链表的首节点和尾节点
</pre><pre name="code" class="cpp">// IntSLLish.h
#ifndef INT_LINKED_LIST
#define INT_LINKED_LIST
#include <iostream>
using namespace std; // 不能忘了,不然下面重载的<< 会报错
class IntSLLNode
{
public:
IntSLLNode()
{
next = NULL; //无参构造函数
}
IntSLLNode(int el)
{
info = el;
next = NULL;
}
int info;
IntSLLNode *next;
};
class IntSLList
{
public:
IntSLList()
{
head = NULL;
tail = NULL;
}
~IntSLList();
int isEmpty()
{
return head == NULL; //判断链表是否为空
}
void addToHead(int); //从首节点添加节点
void addToTail(int); //从尾节点添加节点
int delFromHead(); // 从首节点删除节点
int delFromTail(); // 从尾节点删除节点
bool delNode(int); // 删除指定的某一节点
IntSLLNode* isInList(int); // 判断某一元素是否在链表中
friend ostream& operator<<(ostream&, IntSLList&); //重载<<
private:
IntSLLNode *head, *tail; //head 指向链表的首节点,tail指向链表的尾节点
};
#endif // INTSSLNODE_H_INCLUDED
IntSLList.cpp是头文件IntSLLish.h中函数的实现
// IntSLList.cpp
#include <iostream>
#include <stdlib.h>
#include "IntSLList.h"
IntSLList::~IntSLList() //析构函数
{
IntSLLNode *p;
while(head)
{
p = head->next;
delete head;
head = p;
}
}
// 从首节点处添加节点
void IntSLList:: addToHead(int el)
{
IntSLLNode *temp = new IntSLLNode(el);
if(head == NULL && tail == NULL) //链表为空
{
head = temp;
tail = temp;
}
else if(head == tail && head != NULL) // 链表只有一个节点时
{
temp->next = tail;
head = temp;
}
else //链表节点个数>=2时
{
temp->next = head;
head = temp;
}
}
//从尾节点处添加节点
void IntSLList:: addToTail(int el)
{
IntSLLNode *temp = new IntSLLNode(el);
if(head == NULL && tail == NULL) //链表为空
{
head = temp;
tail = temp;
}
else
{
tail->next = temp;
tail = temp;
}
}
// 从首节点处删除节点
int IntSLList:: delFromHead()
{
int val ;
if(head == tail && head != NULL&& tail != NULL)
{
val = head->info;
delete head;
head = tail = NULL;
}
if(head != tail )
{
val = head->info;
IntSLLNode *temp = head;
head = head->next;
delete temp;
}
return val;
}
// 从尾节点处删除尾节点
int IntSLList:: delFromTail()
{
int val;
if(head == tail && head != NULL&& tail != NULL)
{
val = head->info;
delete head;
head = tail = NULL;
}
if(head != tail )
{
IntSLLNode *p = head;
while(p->next != tail)
{
p = p->next;
}
val = tail->info;
delete tail;
p->next = NULL;
tail = p;
}
return val;
}
//判断某一元素是否在链表中,返回该节点的指针,若元素不在链表中,则返回NULL
IntSLLNode* IntSLList::isInList(int el)
{
IntSLLNode *p = NULL;
if(head == NULL) // 若链表为空
{
return NULL;
}
else
{
p = head;
while(p)
{
if(p->info == el)
return p;
p = p->next;
}
}
return p;
}
// 删除链表中某一元素el
bool IntSLList::delNode(int el)
{
IntSLLNode *r = NULL, *p= head, *temp = NULL;
r = isInList(el);
if(r == NULL)
{
return false; // 链表为空
}
else
{
if(r == head) //若el在首节点处
{
temp = head;
head = head->next;
delete temp;
}
else if(r == tail) // 若el在尾节点处
{
while(p->next!= tail)
{
p = p->next;
}
temp = tail;
p->next = NULL;
tail = p;
delete temp;
}
else //若el在中间的某处
{
while(p->next != r)
{
p = p->next;
}
temp = r;
p->next = r->next;
delete temp;
}
return true;
}
}
// /*
// 重载<<
ostream & operator<<(ostream &output, IntSLList &head)
{
IntSLLNode *p = head.head;
if(p == NULL)
{
output << "linked list is empty!" ;
}
else
{
while(p)
{
output << p->info << " " ;
p = p->next;
}
}
return output;
}
// */
下面是主函数:
// main函数
#include <iostream>
#include "IntSLList.h"
using namespace std;
int main()
{
int a = 2;
IntSLList list1;
list1.addToHead(2); //从首节点处添加元素为2的节点
list1.addToHead(1);
list1.addToTail(3); //从尾节点处添加元素为3的节点
list1.addToTail(4);
//
//IntSLLNode *node = list1.isInList(1);
// bool flag = list1.delNode(3);
// int del1 = list1.delFromHead();
int del2 = list1.delFromTail();
list1.delFromTail();
cout << "del2:" << del2 << endl;
// cout << flag << endl;
// cout << (node != NULL) << endl;
cout << list1 << endl;
return 0;
}