20200115 数据结构和算法之单向链表

单向链表的引入解决了元素删除和增加时顺序表需要移动大量元素的问题,其结构如下:
typedef struct _linkList{
elementType data;
_linkList* next;
}linkNode,linkLIst;
单链表的接口函数如下,包括初始化、尾插法、前插法、指定位置插入、查询元素、删除结点、获取指定位置结点以及链表的销毁:

bool initLinkList(linkList*  &link);//
bool linkInsert_front(linkList* &link, linkNode* &node);//前插入结点		
bool printLink(linkList*& link);//打印链表	
bool linkInsert_back(linkList*& link, linkNode* &node);//尾插入结点
bool linkInsert(linkList*& link, int i, linkNode* &node);//在指定的位置插入结点,正常情况下,i是从1开始的
bool linkGetElement(linkList*& link, int i, linkNode* &node);//获取第i个位置的结点
/*此查找函数的第二个形参不具有通用型,需要调用时改造*/
bool linkFindElement(linkList* &link,int e,int &pos);//单链表查找元素 pos为其位置,
bool linkDeleteElement(linkList*& link, int i);//单链表删除指定位置的元素
void linkDestroy(linkList*& link);//单链表的销毁

完整的代码包括测试项目如下 已通过验证:

#include<Windows.h>
#include<iostream>
using namespace std;
typedef struct _linkList {
	int data;
	struct _linkList* next;
}linkNode,linkList;


bool initLinkList(linkList*  &link);//
bool linkInsert_front(linkList* &link, linkNode* &node);//前插入结点		
bool printLink(linkList*& link);//打印链表	
bool linkInsert_back(linkList*& link, linkNode* &node);//尾插入结点
bool linkInsert(linkList*& link, int i, linkNode* &node);//在指定的位置插入结点,正常情况下,i是从1开始的
bool linkGetElement(linkList*& link, int i, linkNode* &node);//获取第i个位置的结点
/*此查找函数的第二个形参不具有通用型,需要调用时改造*/
bool linkFindElement(linkList* &link,int e,int &pos);//单链表查找元素 pos为其位置,
bool linkDeleteElement(linkList*& link, int i);//单链表删除指定位置的元素
void linkDestroy(linkList*& link);//单链表的销毁
int main() {
	linkList* link=NULL;
	linkNode* node=NULL;
	
	initLinkList(link);//初始化链表

	////01  前插入链表
	int n;
	//std::cout << "请输入要前插的数据个数" << std::endl;
	//std::cin >> n;
	//for (int i = 0; i < n; i++) {
	//	node = new linkNode;
	//	node->next = NULL;
	//	std::cin >> node->data;
	//	linkInsert_front(link, node);
	//}
	//printLink(link);
	//std::cout << "****************************" << std::endl;

	//02  尾插入链表
	std::cout << "请输入要尾插的数据个数" << std::endl;
	std::cin >> n;
	for (int i = 0; i < n; i++) {
		node = new linkNode;
		node->next = NULL;
		std::cin >> node->data;
		linkInsert_back(link, node);
	}
	printLink(link);

	std::cout << "******插入指定位置的结点**********" << std::endl;
	int m;
	for (int i = 0; i < 3; i++) {
		node = new linkNode;
		std::cout << "请输入元素的位置和数据,以空格隔开" << std::endl;
		std::cin >> m >> node->data;
		if (linkInsert(link, m, node)) {
			std::cout << "插入成功!" << std::endl;
		}
		else {
			std::cout << "插入失败!" << std::endl;
		}    
	}
	printLink(link);

	cout <<endl <<"************获取指定位置的元素*****************" << endl;	
	if (linkGetElement(link, 3, node)) {
		cout << "获取的第3个位置的结点元素为" << node->data << endl;
	}
	else {
		cout << "获取的第3个位置的结点元素失败!" << endl;
	}
	cout << endl << "************查找元素*****************" << endl;
	int pos = -1;
	if (linkFindElement(link, 10, pos)) {
		cout << "查找的元素10成功,位置:" << pos << endl;
	}
	else {
		cout << "查找元素10失败!" << endl;
	}

	cout <<endl<< "******************删除指定位置的元素***************" << endl;
	if (linkDeleteElement(link, 2)) {
		cout << "删除成功!" << endl;
		printLink(link);
	}
	else {
		cout << "删除失败" << endl;
	}

	linkDestroy(link);
	system("pause");
	return 0;
}

bool initLinkList(linkList*& link) {
	link = new linkList;
	if (!link) return false;
	link->next = NULL;
	return true;
}
bool linkInsert_front(linkList* &link, linkNode* &node) {
	if (!link || !node) return false;
	node->next = link->next;
	link->next = node;
	return true;
}
bool printLink(linkList*& link) {
	if (!link->next || !link) return false;
	linkList* p = NULL;
	p = link->next;
	while (p) {
		std::cout << p->data << " ";
		p = p->next;
	}
	std::cout << std::endl;
	return true;
}
bool linkInsert_back(linkList*& link, linkNode*& node) {
	if (!link || !node) return false;
	linkNode* p = NULL;
	p = link;
	while (p->next)  p = p->next;
	node->next = NULL;
	p->next = node;
	return true;
}
bool linkInsert(linkList*& link, int i, linkNode*& node) {
	if (!link || !node) return false;
	linkNode* p=NULL;
	p = link;
	int pos = 0;
	while (p && pos < i - 1) {//先找到第i-1个结点的位置,p指向该结点
		p = p->next;
		pos++;
	}
	if (pos > i - 1 || !p) { //分为两种情况,一种是i为负数或者0 ,此时无法插入
		//第二种情况,i已经超过了链表的最大长度,此时指针p 为空,插入失败
		return false;
	}
	node->next = p->next;
	p->next = node;
	return true;
}
bool linkGetElement(linkList*& link, int i, linkNode*& node) {
	if (!link || !node) return false;
	linkList* p = NULL;
	p = link;
	int pos = 0;
	while (p && pos < i) {
		p = p->next;
		pos++;
	}
	if (!p || pos > i) return false;
	node = p;
	return true;
}
bool linkFindElement(linkList*& link, int e,int &pos) {
	if (!link ) return false;
	linkList* p = NULL;
	p = link;
	pos = 0;
	while (p && p ->data!= e) {
		p = p->next;
		pos++;
	}
	if (!p) {//找到最后没有找到数据,查找失败
		pos = -1;
		return false;
	}
	return true;
 }
bool linkDeleteElement(linkList*& link, int i) {
	if (!link) return false;
	linkList* p = link->next;
	linkList* after;
	int pos = 1;
	while (p && pos < i-1) {
		p = p->next;
		pos++;
	}
	if (!(p->next) || pos>i-1) 
		return false;

	after = p->next;
	p->next = after->next;
	delete after;
	return true;	
}
void linkDestroy(linkList* &link) {
	if (!link) return;
	linkList* p = link;

	while (p) {
		link = link->next;
		delete p;
		p = link;
	}
}
发布了48 篇原创文章 · 获赞 0 · 访问量 368

猜你喜欢

转载自blog.csdn.net/weixin_40071289/article/details/103986040