最近复习数据结构课程的时候发现理论知识已经掌握了一些,回想起大一刚学数据结构的时候确实很害怕去敲代码实现一些操作~
于是又重新把代码敲了一遍,颇有一些心得体会,写出来和大家分享一下~~
这是链表的一些操作的实现(C++),包括插入、删除、修改、查找、获取长度、翻转等操作,可以存储不同类型的数据:
//LINKEDLIST.h文件
template<typename typeofdata>
struct NODE
{
typeofdata data;
struct NODE<typeofdata>* next;
};
template<typename typeofdata>
class LINKEDLIST
{
private:
NODE<typeofdata>* head;
public:
LINKEDLIST();
~LINKEDLIST();
int getlength();
NODE<typeofdata>* findkth(int k);
void insertinto(int i, typeofdata x);
void deleteout(int i);
void modify(int i, typeofdata x);
bool findelement(typeofdata x);
void reverselist();
void showall();
};
//LINKEDLIST.cpp文件
#include<iostream>
#include"LINKEDLIST.h"
using namespace std;
//构造函数
template<typename typeofdata>
LINKEDLIST<typeofdata>::LINKEDLIST():head(NULL){}
//析构函数
template<typename typeofdata>
LINKEDLIST<typeofdata>::~LINKEDLIST()
{
NODE<typeofdata>* ptr = head;
while(ptr){
head = head->next;
delete ptr;
ptr = head;
}
}
//获取链表长度
template<typename typeofdata>
int LINKEDLIST<typeofdata>::getlength()
{
int clength = 0;
NODE<typeofdata>* ptr = head;
while(ptr){
ptr = ptr->next;
clength++;
}
return clength;
}
//查找第K(0到length-1)个节点
template<typename typeofdata>
NODE<typeofdata>* LINKEDLIST<typeofdata>::findkth(int k)
{
if(k < 0 || k >= getlength())
{
cout<<"Invalid position!!!"<<endl;
return NULL;
}else
{
int i = 0;
NODE<typeofdata>* ptr = head;
while(i != k){
ptr = ptr->next;
i++;
}
return ptr;
}
}
//在第i(i从-1开始,-1表示插在头结点之前插入或者在空表插入)个节点后面插入一个节点保存数据x
template<typename typeofdata>
void LINKEDLIST<typeofdata>::insertinto(int i, typeofdata x)
{
NODE<typeofdata>* ptr = new NODE<typeofdata>();
if(head == NULL){
ptr->next = head;
ptr->data = x;
head = ptr;
}else if(i >= 0 && i < getlength() - 1)
{
NODE<typeofdata>* pi = findkth(i);
ptr->next = pi->next;
pi->next = ptr;
ptr->data = x;
}else if(i == getlength() - 1 && getlength() > 0)
{
NODE<typeofdata>* pi = findkth(i);
pi->next = ptr;
ptr->next = NULL;
ptr->data = x;
}else
{
cout<<"Node do not exit!!!"<<endl;
}
return;
}
//删除第i个节点
template<typename typeofdata>
void LINKEDLIST<typeofdata>::deleteout(int i)
{
NODE<typeofdata>* ptr = new NODE<typeofdata>();
if(i == 0){
ptr = head;
head = head->next;
delete ptr;
}else if(i > 0 && i <= getlength() - 1)
{
NODE<typeofdata>* pi = findkth(i);
ptr = findkth(i - 1);
ptr->next = pi->next;
delete pi;
}else
{
cout<<"Invalid position!!!"<<endl;
}
return;
}
//修改第i个节点的值
template<typename typeofdata>
void LINKEDLIST<typeofdata>::modify(int i, typeofdata x)
{
if(i >= 0 && i <= getlength() - 1)
{
NODE<typeofdata>* ptr = findkth(i);
ptr->data = x;
}else
{
cout<<"Invalid position!!!"<<endl;
}
return;
}
//判断数据x是否在链表中
template<typename typeofdata>
bool LINKEDLIST<typeofdata>::findelement(typeofdata x)
{
NODE<typeofdata>* ptr = head;
while(ptr != NULL && ptr->data != x){
ptr = ptr->next;
}
if(ptr == NULL) return false;
if(ptr->data == x) return true;
}
//翻转一个链表
template<typename typeofdata>
void LINKEDLIST<typeofdata>::reverselist()
{
NODE<typeofdata>* ptr = head;//当前工作指针
NODE<typeofdata>* pr = ptr->next;//下一个工作指针
NODE<typeofdata>* pe = NULL;//前一个工作指针
while(pr != NULL){//遍历至倒数第二个节点
ptr->next = pe;
pe = ptr;
ptr = pr;
pr = ptr->next;
}
ptr->next = pe;//处理最后一个节点
head = ptr;
return;
}
//展示链表所有元素
template<typename typeofdata>
void LINKEDLIST<typeofdata>::showall()
{
NODE<typeofdata>* ptr = head;
while(ptr){
cout<<ptr->data<<" ";
ptr = ptr->next;
}
cout<<endl;
}
//main函数文件
#include<iostream>
#include"LINKEDLIST.cpp"
using namespace std;
int main()
{
LINKEDLIST<double> mylist;
mylist.insertinto(-1, 1.1);
mylist.insertinto(0, 5.2);
mylist.insertinto(1, 2.3);
mylist.insertinto(2, 7.4);
mylist.insertinto(3, 10.5);
mylist.insertinto(4, 21.6);
mylist.insertinto(5, 14.7);
mylist.insertinto(6, 3.8);
mylist.insertinto(2, 100.9);
mylist.showall();
mylist.deleteout(2);
mylist.modify(4, 200);
mylist.showall();
mylist.reverselist();
mylist.showall();
cout<<mylist.findelement(3.8)<<endl;
cout<<mylist.findkth(2)->data<<endl;
cout<<mylist.getlength()<<endl;
return 0;
}