您的位置:首页 > 理论基础 > 数据结构算法

#1 数据结构学习 ---- 单链表

2015-10-08 19:11 423 查看
单链表定义:

/* Author : grey_qisen */
// LinkList.h -- initialization of linklist

#ifndef LinkList_H
#define LinkList_H

#include <iostream>
using namespace std;

template<class DataType>
struct LinkNode{
DataType data;
LinkNode<DataType> *next;
};

template<class DataType>
class LinkList{
public:
LinkList();                                         // 无参构造单链表
LinkList_B(DataType a[],int n);                     // 头插法构造单链表
LinkList_E(DataType a[],int n);                     // 尾插法构造单链表
~LinkList();                                        // 析构函数
int length();                                       // 返回单链表表长
bool Insert(int p,DataType x);                      // 在第p个结点处插入结点
bool Delete_l(int p);                               // 按位删除第i个结点
bool Delete_v(DataType x);                          // 按值删除所有值为x的结点
DataType Find_l(int p);                             // 按位查找第i个结点的值
int Find_v(DataType x);                             // 按值查找值为x的元素位置
void PrintList();                                   // 顺序打印单链表
private:
LinkNode<DataType> *head;                           // 单链表头指针
};

template<class DataType>
LinkList<DataType>::LinkList(){                             // 无参构造单链表
head = new LinkNode<DataType>;
head->next = NULL;
}

template<class DataType>
LinkList<DataType>::LinkList_B(DataType a[],int n){         // 头插法构造单链表
head = new LinkNode<DataType>;
head->next = NULL;

LinkNode<DataType> *s;
for(int pos = 0;pos < n;pos++){
s = new LinkNode<DataType>;
s->data = a[pos];
s->next = head->next;
head->next = s;
}
}

template<class DataType>
LinkList<DataType>::LinkList_E(DataType a[],int n){         // 尾插法构造单链表
head = new LinkNode<DataType>;
head->next = NULL;

LinkNode<DataType> *s;  LinkNode<DataType> *temp;
temp = head;
for(int pos = 0;pos < n;pos++){
s = new LinkNode<DataType>;
s->data = a[pos];
s->next = temp->next;
temp->next = s;
temp = s;
}
temp->next = NULL;
}

template<class DataType>
LinkList<DataType>::~LinkList(){                            // 析构函数
LinkNode<DataType> *temp;
while(head->next != NULL){
temp = head;
head = head->next;
delete temp;
}
}

template<class DataType>
int LinkList<DataType>::length(){                           // 单链表求长
int length = 0;
LinkNode<DataType> *temp;
temp = head;
while(temp->next != NULL){
temp = temp->next;
length += 1;
}
cout << "This LinkList has " << length << " nodes." << endl;
return length;
}

template<class DataType>
bool LinkList<DataType>::Insert(int p,DataType x){          // 在第p个结点处插入结点
LinkNode<DataType> *temp;    LinkNode<DataType> *s;
s = new LinkNode<DataType>;
int pos = 0;
s->data = x;
temp = head;
while(temp != NULL && pos < p-1){
temp = temp->next;
pos++;
}
if(temp == NULL){
cout << "ERROR Parameters!" << endl;
return false;
} else{
s->next = temp->next;
temp->next = s;
cout << "Insert success!" << endl;
return true;
}

}

template<class DataType>
bool LinkList<DataType>::Delete_l(int p){                   // 按位删除第p结点
if(p < 1){
cout << "ERROR Parameters!" << endl;
return false;
}
int pos = 0;
LinkNode<DataType> *temp;   LinkNode<DataType> *s;
temp = head;
while(temp != NULL & pos < p-1){
temp = temp->next;
pos++;
}
if(temp == NULL || temp->next == NULL){
cout << "ERROR Parameters!" << endl;
} else{
s = temp->next;
temp->next = temp->next->next;
delete s;
cout << "Delete Success!" << endl;
return true;
}
}

template<class DataType>
bool LinkList<DataType>::Delete_v(DataType x){              // 按值删除所有值为x的结点
DataType D_temp;    int num = 0;
LinkNode<DataType> *N_temp;     LinkNode<DataType> *s;
N_temp = head;

while(N_temp->next != NULL){
if(N_temp->next->data == x){
s = N_temp->next;
N_temp->next = N_temp->next->next;
delete s;
cout << "Program has been delete " << ++num << " Node." << endl;
} else{
N_temp = N_temp->next;
}
}
return true;
}

template<class DataType>
DataType LinkList<DataType>::Find_l(int p){                 // 按位查找第p个结点的值
int pos = 0;    LinkNode<DataType> *temp;
temp = head;
if(p < 1){
cout << "ERROR Parameters!" << endl;
} else{
while(pos < p){
if(temp == NULL){
cout << "ERROR Parameters!" << endl;
} else{
temp = temp->next;
pos += 1;
}
}
cout << "The " << p << "th node's data is " << temp->data << "." << endl;
return temp->data;
}
}

template<class DataType>
int LinkList<DataType>::Find_v(DataType x){                 // 按值查找第一个值为x的结点
int pos = 1;    LinkNode<DataType> *temp;
temp = head->next;
while(temp != NULL){
if(temp->data == x){
cout << "The " << pos << "th node's data is " << x << "." << endl;
return pos;
} else{
temp = temp->next;
pos += 1;
}
}
cout << "The Node you want to find is not exit in this linklist!" << endl;
return 0;
}

template<class DataType>
void LinkList<DataType>::PrintList(){                       // 顺序打印单链表
LinkNode<DataType> *temp;
temp = head->next;
while(temp != NULL){
cout << temp->data << " ";
temp = temp->next;
}
cout << "#" << endl;
}

#endif


单链表测试

/* Author : grey_qisen */
//LinkList.cpp -- testing the LinkList
#include<iostream>
#include"LinkList.h"

using namespace std;

int main(){
char num[5] = {'a','b','c','d','e'};

// --------------- 头插法检测  -----------------------------
LinkList<char> NumList_B;
NumList_B.LinkList_B(num,5);
NumList_B.PrintList();
NumList_B.length();

NumList_B.Insert(6,'f');
NumList_B.PrintList();
NumList_B.length();

NumList_B.Delete_l(6);
NumList_B.PrintList();

NumList_B.Delete_v('a');
NumList_B.PrintList();

NumList_B.Find_l(0);
NumList_B.Find_l(3);

NumList_B.Find_v('e');
NumList_B.Find_v('f');

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: