标签归档:链表

链表程序示例(图书类C++)

简单图书类示例

使用链表实现, 当然使用类(结构体)的数组都能实现, 程序使用的是C++原因, 基本上可以用C语言实现. 经过一番测试, 函数基本完美. 其中书本自动插入函数着实比较难, 不过好歹写出来.
show

代码程序(300多行, 比较简陋):

 

/******************************************************************
	Name:   	C++链表程序演示
	Date:  		2014-11-11 19:57:50
	Author: 	lnesuper
    Version:    V0.6
    Discripts:  实现元素智能插入(排序插入), 测试功能正常
*******************************************************************/

#include <iostream>
#include <stdlib.h>         //atoi(), atof()函数所在的头文件
using namespace std;

//图书类的定义
class book {
	public:
		int num;            //图书编号
		float price;        //图书价格
		book* pNext;        //下一个节点指针
};

//函数原型声明
book* creat(void);          		//创建链表
bool ncheck(string str);    		//判断字符串是否是纯数字
bool strcheck(string str);			//判断字符串是否是数字和"."的组合(可以看作为小数)
bool repeat(book* pHead, int num);   //判断id是否相等
void show(book* pHead);  			//显示链表
void del(book* pHead); 				//删除图书类节点
void add(book* pHead);   			//尾部追加节点
void preadd(book* pHead); 			//头部插入
void autoadd(book* pHead);   		//顺序添加
int getnum(book* pHead);       		//获取节点个数

int main(void) {
	cout << "----------------生成书库----------------" << endl;
	book* pHead = creat();      //生成一个book类的链表
	show(pHead);                //显示book类的pHead对象内容
	cout << "----------------删除书库----------------" << endl;
	del(pHead);
	show(pHead);
	cout << "----------------尾部添加----------------" << endl;
	add(pHead);
	show(pHead);
	cout << "----------------头部添加----------------" << endl;
	preadd(pHead);
	show(pHead);
	cout << "----------------智能添加----------------" << endl;
	autoadd(pHead);
	show(pHead);
	cout << "--------------------------------" << endl;
	cout << "统计共" << getnum(pHead) << "本图书" << endl;

	return 0;
}

book* creat(void) {
	book *pHead = new book;     //定义一个头指针
	book *p = pHead;            //定义一个p指针, 它指向头指针
	pHead->pNext = NULL;        //将头指针的pNext成员(指针)赋为空
	string str;                 //C++字符串类
	do {
		//判断输入是否为数字组合
		do {

			do {
				cout << "请输入图书的整形编号(数字0结束输入): ";
				cin >> str;
			} while (!ncheck(str.c_str()));
			
			if (repeat(pHead, atoi(str.c_str()))) {
				cout << "Warning!!! 输入的编号已存在\n" << endl;
				continue;
			}
		} while (repeat(pHead, atoi(str.c_str())));
		book *pNew = new book;      //生成一个book类pNext对象

		pNew->num = atoi(str.c_str());    	 	//pNew->num

		if (0 != pNew->num) {
			//判断输入字符串是否为数字和"."的组合
			do {
				cout << "请输入编号为" << pNew->num << "的图书的价格(数字): ";
				cin >> str;
			} while (!strcheck(str.c_str()));
			pNew->pNext = NULL;                 //pNew->pNext
			pNew->price = atof(str.c_str());	//pNew-price
			p->pNext = pNew;
			p = pNew;
		} else {
	        delete pNew;
	        p->pNext = NULL;
	        pNew = NULL;

			return pHead;
		}
		
	} while (true);

}


//判断字符串是否为开头不为零的纯数字组成函数
bool ncheck(string str) {
	int i;
	for (i = 0; i < str.length(); i++) {
		if (str[i] >= '0' && str[i] <= '9')
			continue;
		else
			return false;
	}
	return true;
}

//判断字符串是否为非零浮点数函数
bool strcheck(string str) {
	int i;
	for (i = 0; i < str.length(); i++) {
		if (str[i] >= '0' && str[i] <= '9' || str[i] == '.')
			continue;
		else
			return false;
	}
	return true;
}

//判断类成员num的值是否相等
bool repeat(book* pHead, int num) {
	book* p = pHead;
	while (NULL != p->pNext) {
		p = p->pNext;
		if (num == p->num || 0 == p->num) {
			return true;
		}
	}
	return false;
}

//显示图书信息
void show(book* pHead) {
	book* p = pHead;
	if (NULL == pHead->pNext) {
		cout << "链表为空\n" << endl;
	} else {
		cout << "================图书信息================" << endl;
		do {
			p = p->pNext;
			cout << "图书编号: " << p->num << " 该书的价格: " << p->price << endl;
		} while (NULL != p->pNext);
		cout << "共" << getnum(pHead) << "本图书, 输出完毕" << endl;
		cout << "========================================" << endl;
	}

	return;
}

//删除图书编号为id的节点
void del(book* pHead) {

	if (NULL == pHead->pNext) {
		cout << "链表为空, 无法删除" << endl;

		return;
	} else {
		string st;
        do {
			cout << "请输入需要删除的图书编号(非负整数): ";
			cin >> st;
		} while (!ncheck(st.c_str()));
		int id = atoi(st.c_str());
		book* p = pHead;

		do {
			book* pT = p->pNext;
			if (id == pT->num) {
				p->pNext = pT->pNext;
				delete pT;
				cout << "删除成功" << endl;

				return;
			} else
				p = p->pNext;
		} while (NULL != p->pNext);
		cout << "未找到元素, 删除失败" << endl;
		return;
	}
}

//添加图书信息函数
void add(book* pHead) {
	book* p = pHead;

	//将指针指向尾节点
	while (NULL != p->pNext) {
		p = p->pNext;
	}

	//添加节点
	book* pNode = new book;
	
    string str;
	cout << "请输入添加图书的整形(非0数字)编号: ";
	cin >> str;
	while (!ncheck(str.c_str()) || 0 == atoi(str.c_str()) || repeat(pHead, atoi(str.c_str()))) {
		if (repeat(pHead, atoi(str.c_str()))) {
			cout << "Warning!!! 输入的编号已存在\n" << endl;
		}
		cout << "请输入添加图书的整数(非0数字)编号: ";
		cin >> str;
	}
	pNode->num = atoi(str.c_str());
	do {
		cout << "请输入编号为" << pNode->num << "的图书的价格(数字): ";
		cin >> str;
	} while (!strcheck(str.c_str()));
	pNode->price = atof(str.c_str());
	pNode->pNext = NULL;
	p->pNext = pNode;
	cout << "\n" << endl;
	
	return;
}

void preadd(book* pHead) {
	book* pNode = new book;
	string str;
	cout << "请输入添加图书的整形(非0数字)编号: ";
	cin >> str;
	while (!ncheck(str.c_str()) || 0 == atoi(str.c_str()) || repeat(pHead, atoi(str.c_str()))) {
		if (repeat(pHead, atoi(str.c_str()))) {
			cout << "Warning!!! 输入的编号已存在\n" << endl;
		}
		cout << "请输入添加图书的整数(非0数字)编号: ";
		cin >> str;
	}

	pNode->num = atoi(str.c_str());
	do {
		cout << "请输入编号为" << pNode->num << "的图书的价格(数字): ";
		cin >> str;
		} while (!strcheck(str.c_str()));
	pNode->price = atoi(str.c_str());
	
	pNode->pNext = pHead->pNext;
	pHead->pNext = pNode;

	return;
}

//智能添加节点
void autoadd(book* pHead) {
	book* pNode = new book;
	    string str;
	cout << "请输入添加图书的整形(非0数字)编号: ";
	cin >> str;
	while (!ncheck(str.c_str()) || 0 == atoi(str.c_str()) || repeat(pHead, atoi(str.c_str()))) {
		if (repeat(pHead, atoi(str.c_str()))) {
			cout << "Warning!!! 输入的编号已存在\n" << endl;
		}
		cout << "请输入添加图书的整数(非0数字)编号: ";
		cin >> str;
	}
	pNode->num = atoi(str.c_str());
	do {
		cout << "请输入添加的图书编号为" << pNode->num << "的图书的价格(数字): ";
		cin >> str;
		} while (!strcheck(str.c_str()));
	pNode->price = atoi(str.c_str());
	
	pNode->pNext = NULL;

	if (NULL == pHead->pNext) {
		pHead->pNext = pNode;

		return;
	} else {
		book* p = pHead;
		book* pT = p->pNext;
		do {
			if (pNode->num < pT->num) {
				pNode->pNext = pT;
				p->pNext = pNode;
				
				return;
			} else if (pT->pNext == NULL) {
				pNode->pNext = pT->pNext;
				pT->pNext = pNode;
				
				return;
			} else {
				p = pT;
				pT = pT->pNext;
			}
		} while (true);
	}
 }

//获取链表长度
int getnum(book* pHead) {
	int cnt = 0;
	book* p = pHead;
	while (NULL != p->pNext) {
		p = p->pNext;
		cnt++;
	}

	return cnt;
}

/*
Test Result:
----------------------
----------------生成书库----------------
请输入图书的整形编号(数字0结束输入): 3
请输入编号为3的图书的价格(数字): 33.3
请输入图书的整形编号(数字0结束输入): 5
请输入编号为5的图书的价格(数字): 55.5
请输入图书的整形编号(数字0结束输入): 3
Warning!!! 输入的编号已存在

请输入图书的整形编号(数字0结束输入): 0
================图书信息================
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
共2本图书, 输出完毕
========================================
----------------删除书库----------------
请输入需要删除的图书编号(非负整数): 0
未找到元素, 删除失败
================图书信息================
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
共2本图书, 输出完毕
========================================
----------------尾部添加----------------
请输入添加图书的整形(非0数字)编号: 0
请输入添加图书的整数(非0数字)编号: 3
Warning!!! 输入的编号已存在

请输入添加图书的整数(非0数字)编号: 2
请输入编号为2的图书的价格(数字): 22

================图书信息================
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
图书编号: 2 该书的价格: 22
共3本图书, 输出完毕
========================================
----------------头部添加----------------
请输入添加图书的整形(非0数字)编号: 6
请输入编号为6的图书的价格(数字): 66
================图书信息================
图书编号: 6 该书的价格: 66
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
图书编号: 2 该书的价格: 22
共4本图书, 输出完毕
========================================
----------------智能添加----------------
请输入添加图书的整形(非0数字)编号: 7
请输入添加的图书编号为7的图书的价格(数字): 77
================图书信息================
图书编号: 6 该书的价格: 66
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
图书编号: 2 该书的价格: 22
图书编号: 7 该书的价格: 77
共5本图书, 输出完毕
========================================
--------------------------------
统计共5本图书

*/

小更新:

添加字符界面
下载: 源代码下载