C++实现单链表

单链表

线性表的链式存储结构称为链表。
在链表中每个结点中包含后继结点的地址信息,这称为指针域,这样可以通过一个结点的指针域找到后继结点的位置。如果每个结点只设置一个指针域,用于指向其后继结点,这样构成的链表称为线性单向连接表,简称单链表。

单链表的实现

  1. 单链表的初始化和销毁
  2. 采用尾插法建立单链表
  3. 输出单链表
  4. 求单链表的长度
  5. 判断单链表是否为空
  6. 求单链表某个位置的元素值
  7. 查找元素
  8. 插入元素
  9. 删除元素

定义一个结点类

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值