Single linked list data structure --C ++

Ado, directly on the code, including C ++ implementation is created and destroyed on a single linked list, inserting, deleting, seek length, the basic operation of elements having the value

//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;
}

 

Published 51 original articles · won praise 5 · Views 2028

Guess you like

Origin blog.csdn.net/MARS_098/article/details/103110114