C++实现单链表
单链表
线性表的链式存储结构称为链表。
在链表中每个结点中包含后继结点的地址信息,这称为指针域,这样可以通过一个结点的指针域找到后继结点的位置。如果每个结点只设置一个指针域,用于指向其后继结点,这样构成的链表称为线性单向连接表,简称单链表。
单链表的实现
- 单链表的初始化和销毁
- 采用尾插法建立单链表
- 输出单链表
- 求单链表的长度
- 判断单链表是否为空
- 求单链表某个位置的元素值
- 查找元素
- 插入元素
- 删除元素
定义一个结点类
#include <iostream>
using namespace std;
class Node{
public:
char data;//存放char类型元素
Node* next;//指向下一个结点域
};
定义一个LinkList类
class LinkList{
public:
LinkList();
~LinkList();
void creatLinkListR();
void dispList();
int listLength();
bool isEmpty();
bool getElemByIndex(int i,char &e);
int getElemByElem(char e);
bool InsertLinkList(int i,char e);
bool DeletElem(int i);
private:
Node* head; //单链表头结点指针
int length;//单链表长度
};
1.单链表的初始化和销毁
LinkList::LinkList(){
head = new Node();//创建一个头结点
head->next = NULL;//头结点无后继结点
length = 0;
}
LinkList::~LinkList(){
Node *pre,*p;//创建两个临时结点
pre = head;//pre指向头结点
p = pre->next;//p指向其后继结点
while(p!=NULL){
delete pre;//释放前一个结点
pre = p;
p = p->next;//pre和p同步后移
}
delete pre; //当p=NULL时,pre指向尾结点,释放尾结点
}
2.采用尾插法创建单链表
void LinkList::creatLinkListR(){
Node *s,*r;
r = head;//r始终指向尾结点,开始时使其指向头结点
char c;
cout << "请输入要插入的元素(输入0结束):" ;
while(cin>>c,c!='0'){//可以一次输入多个元素,中间用空格隔开,以0结尾
s = new Node(); //创建数据结点s
s->data = c;
r->next = s;//将s结点插入r结点后
r = s;//使r结点指向尾结点
length++;
}
r->next = NULL;//插入元素结束,将尾结点的next域置为NULL
}
3.输出单链表
void LinkList::dispList(){
Node *p;
p = head->next;//p指向第一个含有元素的结点
while(p!=NULL){//p不为NULL,输出*p结点的data域
cout << p->data << " ";
p = p->next;//p移向下一个结点
}
cout << endl;
}
4.求单链表长度
int LinkList::listLength(){
return length;
}
5.判断单链表是否为空
bool LinkList::isEmpty(){
if(length){
cout << "链表不为空" << endl;
return false;
}else{
cout << "链表为空" << endl;
return true;
}
}
6. 求单链表某个位置的元素值
bool LinkList::getElemByIndex(int i,char &e){
Node *p;
int j=1;
p = head->next;//从第一个有data的结点开始查找
while(p!=NULL){
if(i==j){
e = p->data;
return true;//找到就返回
}
p = p->next;//没找到就继续,知道p指针为空
j++;
}
return false;
}
7.查找元素
int LinkList::getElemByElem(char e){
Node *p;
int i=1;
p = head->next;//从第一个有data的结点开始查找
while(p!=NULL){
if(p->data==e){
return i;//找到了就返回元素位置
}
i++;
p = p->next;
}
return -1;
}
8.插入元素
bool LinkList::InsertLinkList(int i,char e){
Node *p,*n;
int j=1;
p = head;//从head结点开始,这样能插入到第一个
while(p!=NULL){
if(i==j){
n = new Node(); //创建新结点n,使其data域置为e
n->data = e;
n->next = p->next;//先将结点n的next域指向结点p的next域
p->next = n;//再将结点p的next域指向结点n
return true;
}
j++;
p = p->next;
}
return false;
}
9.删除元素
bool LinkList::DeletElem(int i){
Node *p,*n;
int j=1;
p = head;
while(p!=NULL){
n = p->next;
if(i==j&&n!=NULL){
p->next = n->next;
delete n;
return true;
}
j++;
p = p->next;
}
return false;
}