废话不多说,直接上代码,包括C++实现单链表的创建销毁、插入、删除、求长度,取元素值等基本操作
//created by kong at 2019-11-17
#include<iostream>
using namespace std;
template<typename T>
struct LinkList{ //单链表结点类型
T data; //存放数据元素
LinkList<T> *next; //指向下一个结点的域
};
template<typename T> //单链表类模板
class LinkListClass{ //单链表头结点指针
LinkList<T> *head;
public:
LinkListClass<T>(); //构造函数,创建一个空单链表
~LinkListClass<T>(); //析构函数,销毁单链表
void CreateListF(T a[], int n); //用头插法建立单链表
void CreateListR(T a[], int n); //用尾插法建立单链表
void DispList(); //输出单链表中所有结点值
int ListLength(); //求单链表中数据结点个数
int GetElem(int i); //求单链表中某个元素值
int LocateElem(T e); //按元素值查找
bool ListInsert(int i, T e); //插入数据元素
bool ListDelete(int i); //删除数据元素
};
template<typename T>
void LinkListClass<T>::CreateListF(T a[], int n){ //采用头插法建立单链表
LinkList<T>*s;
int i;
head->next = NULL; //将头结点的next域置为NULL
for (i = 0; i < n; i++){ //循环建立数据结点
s = new LinkList<T>();
s->data = a[i];
s->next = head->next; //创建数据结点*s
head->next = s; //将*s结点插入到开始结点之前、头结点之后
}
}
template<typename T>
void LinkListClass<T>::CreateListR(T a[], int n){ //采用尾插法建立单链表
LinkList<T> *s, *r;
int i;
r = head; //r始终指向尾结点,开始时指向头结点
for(i = 0; i < n; i++){ //循环建立数据结点
s = new LinkList<T>();
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
template<typename T>
LinkListClass<T>::LinkListClass<T>(){ //构造函数,创建一个空的单链表
head = new LinkList<T>();
head->next = NULL;
}
template<typename T>
LinkListClass<T>::~LinkListClass<T>(){ //析构函数,销毁单链表
LinkList<T> *pre, *p;
pre = head; p = pre->next; //pre指向头结点,p指向其后继结点
while (p != NULL){
delete pre; //释放前一个结点
pre = p; p = p->next; //pre、p同步后移
}
delete pre; //当p=NULL时,pre指向尾结点,且需要释放尾结点
cout << "LinkList Destructing..." << endl;
}
template<typename T>
void LinkListClass<T>::DispList(){ //输出链表所有结点值
LinkList<T> *p;
p = head->next; //p指向开始结点
cout << "链表元素为:";
while (p != NULL){
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
template<typename T>
int LinkListClass<T>::ListLength(){ //求单链表中数据结点个数
int i = 0; LinkList<T> *p;
p = head;
while (p->next != NULL){
i++;
p = p->next;
}
return (i); //循环结束,p指向尾结点,序号i为结点个数
}
template<typename T>
int LinkListClass<T>::GetElem(int i){//求单链表中某个数据元素值
int j = 0;
LinkList<T> *p;
p = head; //p指向头结点,j置为0
while (j < i&&p != NULL){
j++;
p = p->next;
}
if (p == NULL) //不存在这个结点,返回false
return false;
else{ //存在,返回结点元素值
return p->data;
}
}
template<typename T>
int LinkListClass<T>::LocateElem(T e){ //按元素查找
int i = 1;
LinkList<T> *p;
p = head->next; //p指向开始结点,i置为1
while (p != NULL&&p->data != e){ //查找data值为e的结点*p,序号为i
p = p->next;
i++;
}
if (p == NULL)
return 0; //不存在返回0
else
return i; //存在返回其逻辑序号i
}
template<typename T>
bool LinkListClass<T>::ListInsert(int i,T e){ //插入一个新元素
LinkList<T> *s, *p;
int j = 0;
if (i < 1) return false; //i<1时返回错误
p = head;
while (j < i - 1 && p != NULL){
j++;
p = p->next;
}
if (p == NULL) return false;
else{
s = new LinkList<T>();
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
template<typename T>
bool LinkListClass<T>::ListDelete(int i){ //删除数据元素
int j = 0;
LinkList<T> *q, *p;
if (i < 1) return false;
p = head;
while (j < i - 1 && p != NULL){
j++;
p = p->next;
}
if (p == NULL) return false;
else{
q = p->next;
if (q == NULL) return false;
p->next = q->next;
delete q;
return true;
}
}
int main(){
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
LinkListClass<int> l1;
l1.CreateListF(a,10);l1.DispList();
//l1.CreateListR(a, 10);l1.DispList();
cout << l1.ListLength() << endl;
cout << l1.GetElem(5) << endl;
cout << l1.LocateElem(7) << endl;
l1.ListInsert(3, 11); l1.DispList();
l1.ListDelete(7); l1.DispList();
return 0;
}