数据结构-单链表

1、单链表定义

2、单链表的创 建、插入、删除、 查找等功能的 实现

3、单链表的测试运行

4、实现代码

#include
#include
#include
#include
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
#define MAXSIZE 100  
struct Book {
    string id;//ISBN
    string name;//书名
    double price;//定价
};

typedef struct Lnode
{
    Book elem;
	struct Lnode* next;

}Lnode, * SqList;

Status InitList_Sq(SqList& L)  //链表的初始化
{
	L = new Lnode;   //创建一个头结点,头指针指向头节点
	L->next = NULL;    //头节点的next指向空
	return OK;
}

Status GetElem(SqList L, int i, Book& e)//单链表的取值,返回第i个位置的元素给e
{
	SqList p = L;    //定义一个工具指针指向首元节点
	int count = 0;                  //定义一个计数器
	while (p && count < i)     //当p指向不为空并且计数器小于i时p指向下一个结点,计数器加一
	{
		p = p->next;
		count++;
	}
	if (!p || count > i)    //如果p为空或者i位置不合法返回error
		return ERROR;
	e = p->elem;
	return OK;
}
SqList LocateElem_Sq(SqList L, double e)  //在链表查找data,返回指向data 的指针
{
    SqList p = L->next;
	while (p && p->elem.price!= e)    //当p指向的结点的元素不是data时候,p指向下一个结点
		p = p->next;
	return p;
}
Status ListInsert_Sq(SqList& L, int i, Book e)  //插入,在第i个位置插入data
{
    SqList p = L;
	int count = 0;   //定义一个计数器
	while (p && count < i - 1)//找到第i个元素的位置
	{
		p = p->next;
		count++;
	}
	if (!p || count > i + 1)  //如果i不合法返回错误
		return ERROR;
    SqList q = new Lnode;//创建一个指针q指向一个新的结点
	q->elem = e;         //新结点存放插入的数据
	q->next = p->next;    //s指向原来第i个元素的位置
	p->next = q;         //p指向q指向新的结点
	return OK;
}
Status ListDelete_Sq(SqList& L, int i)  //删除结点
{
	SqList p = L;
	int count = 0;
	while (p && count < i - 1)   //让p指向第i个位置的前一个结点
	{
		p = p->next;
		count++;
	}
	if (!(p->next) || count > i - 1)
		return ERROR;
	SqList q = p->next;
	p->next = q->next;
	delete q;
	return OK;
}
int main() {
    SqList L=NULL;
    int i = 1, a, c, choose;
    SqList p = NULL;
    double price;
    Book e;
    Book temp;
    SqList temp2;
    string head_1, head_2, head_3;
    cout << "欢迎使用链表相关功能\n";
    cout << "\t1. 建立\n";
    cout << "\t2. 输入\n";
    cout << "\t3. 取值\n";
    cout << "\t4. 查找\n";
    cout << "\t5. 插入\n";
    cout << "\t6. 删除\n";
    cout << "\t7. 输出\n";
    cout << "\t0. 退出\n\n";

    choose = -1;
    while (choose != 0) {
        cout << "请选择功能选项(0-7):";
        cin >> choose;
        switch (choose) {
        case 1://创建单链表
            if (InitList_Sq(L))
                cout << "成功建立链表\n\n";
            else
                cout << "链表建立失败\n\n";
            break;
        case 2: {//单链表信息输入
            fstream file;
            file.open("book.txt");
            int i = 1;
            SqList p = L;
            if (!file) 
            {
                cout << "错误!未找到文件!" << endl;
                exit(ERROR);
            }
            file >> head_1 >> head_2 >> head_3;
            while (!file.eof()) {
                Book k;
                file >> k.id >> k.name >>k.price;
                SqList n = new Lnode;
                n->elem = k;
                n->next = NULL;
                p->next = n;
                p = p->next;

            }
            cout << "输入 book.txt 信息完毕\n\n";
            file.close();
        }
              break;
        case 3://单链表的取值
            cout << "请输入一个位置用来取值:";
            cin >> i;
            GetElem(L, i, temp);
            if (temp.price != 0) {
                cout << "查找成功\n";
                cout << "第" << i << "本图书的信息是:\n";
                cout << left << setw(18) << temp.id << "\t" << left << setw(30)
                    << temp.name << "\t" << left << setw(5) << temp.price << endl
                    << endl;
            }
            else
                cout << "查找失败!位置超出范围\n\n";
            break;
        case 4: //单链表的查找
            cout << "请输入所要查找价格:";
            cin >> price;
            temp2 = LocateElem_Sq(L, price);
            if (temp2!= 0) {
                cout << "查找成功\n";
                cout << "该价格对应的书名为:" << temp2->elem.name << endl << endl;
            }
            else
                cout << "查找失败!没有这个价格对应的书籍\n\n";
            break;
        case 5: //单链表的插入
            cout << "请输入插入的位置和书本信息,包括:编号 书名 价格(用空格隔开):";
            cin >> a;
            cin >> e.id >> e.name >> e.price; 
            if (ListInsert_Sq(L, a, e))
                cout << "插入成功.\n\n";
            else
                cout << "插入失败.\n\n";
            break;
        case 6: //单链表的删除
            cout << "请输入所要删除的书籍的位置:";
            cin >> c;
            if (ListDelete_Sq(L, c))
                cout << "删除成功.\n\n";
            else
                cout << "删除失败.\n\n";
            break;
        case 7: //单链表的输出
        {SqList m = L->next;
        cout << "当前图书系统信息(单链表)读出:\n";
        while (m)
        {
            cout << left << setw(18) << m->elem.id << "\t" << left
                << setw(30) << m->elem.name << "\t"
                << m->elem.price << endl;
            cout << endl;
            m = m->next;
        }
        break;
        }
        case 0:
            cout << "感谢使用,欢迎多提宝贵意见!" << endl;
            return 0;//exit(0);          	
        default:
            cout << "输入错误!-->";
        }
    }
    return 0;
}

你可能感兴趣的:(数据结构)