Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<ctime>
- #include<cstdlib>
- using namespace std;
- const int MaxSize = 100;
- // 使用nullptr代替NULL
- template <typename DataType>
- struct Node {
- DataType data;
- Node<DataType> *next;
- Node() {data = 0; next = nullptr; }
- Node(DataType _code) { data = _code; next = nullptr; } // 添加了构造函数
- Node(DataType _code, Node<DataType> *_next) { data = _code; next = _next; } // 添加了构造函数
- };
- template <typename DataType>
- class LinkList {
- public:
- LinkList() {
- first = new Node<DataType>;
- }
- ~LinkList() {
- deleteAll();
- }
- int length() {
- Node<DataType> *p = first -> next;
- int count = 0;
- for (; p != nullptr; count++) p = p -> next;
- return count;
- }
- void deleteAll(){
- Node<DataType> *p = first -> next;
- Node<DataType> *q = first -> next;
- while (p != nullptr){
- p = p -> next;
- delete q;
- q = p;
- }
- first -> next = nullptr;
- }
- //这个也不需要了
- // int locate(DataType x) {
- // Node<DataType> *p = first -> next;
- // int count = 1;
- // while(p != nullptr) {
- // if(p -> data == x) return count;
- // p = p -> next;
- // count++;
- // }
- // return 0;
- // }
- // 看下面
- // void insert(int i, DataType x) {
- // Node<DataType> *p = first, *s = nullptr;
- // int count = 0;
- // while(p != nullptr && count < i - 1) {
- // p = p -> next;
- // count++;
- // }
- // if(p == nullptr) throw "插入位置错误";
- // else {
- // s = new Node<DataType>;
- // s -> data = x;
- // s -> next = p -> next;
- // p -> next = s;
- // }
- // }
- //在头部添加一项, code是密码
- void insertToStartByCode(DataType code) {
- Node<DataType> *newItem = new Node<DataType> (code);
- newItem -> next = first -> next;
- first -> next = newItem;
- }
- // 这里删除应该是以在链表里的顺序来的, 实际上不需要这样
- // 好一点的处理方式是传入密码, 之后搜寻密码相符的项删掉
- // 另外这里应该返回的是一个指向Node<DataType>类型的指针..而不是一个DataType类型的值
- // DataType Delete(int i) {
- // DataType x;
- // Node<DataType> *p = first, *q = nullptr;
- // int count = 0;
- // while(p != nullptr && count < i - 1) {
- // p = p -> next;
- // count++;
- // }
- // 另外如果p在链尾的话, 是有p -> next == nullptr满足的, 此时是不能抛出错误的.
- // if(p == nullptr || p -> next == nullptr) {
- // throw"删除位置错误";
- // }
- // else{
- // q = p -> next;
- // x = q -> data;
- // p -> next = q -> next;
- // delete q;
- // return x;
- // }
- // }
- Node<DataType> *findFrontOneBySelfCode(DataType code){
- Node <DataType> *p = first;
- while (p -> next != nullptr) {
- if(p -> next -> data == code) break;
- p = p -> next;
- }
- // 如果可以找到节点, 此时该节点应为 p->next
- return p;
- }
- Node<DataType> *deleteByCode(DataType code) {
- Node <DataType> *p = findFrontOneBySelfCode(code);
- if (p -> next == nullptr) return nullptr;
- else {
- Node <DataType> *foundNode = p -> next;
- p -> next = foundNode -> next;
- return foundNode;
- }
- }
- void printList() {
- Node<DataType> *p = first -> next;
- cout << "All Items: ";
- while(p != nullptr) {
- cout << p -> data << ", ";
- p = p -> next;
- }
- cout << "\b\b." << endl;
- }
- // 不需要单独的查找函数, 功能已合并至删除操作内
- // DataType get(int i) {
- // Node<DataType>*p=first->next;
- // int count =1;
- // while(p!=nullptr&&count<i)
- // {
- // p=p->next;
- // count++;
- // }
- // if(p==nullptr) throw"查找位置错误";
- // else return p->data;
- // }
- private:
- Node<DataType> *first; // head node
- };
- // 注意下面几个函数的参数需要传地址的形式, 这也是一开始程序不正常的最直接原因
- void store(LinkList<int> &L) {
- if(L.length() >= MaxSize) {
- cout << "存包柜已满!";
- return ;
- }
- int x, b = 9999, a = 1000; // 这里的变量命名.... x => code, b => maxRandomRange, a => minRandomRange
- srand((int) time(0));
- do { // 防止重复
- //x = rand() % (b - a + 1) + b; 这里随机数范围写错了..而且ab均未初始化就拿来使用
- x = (rand() % (b - a + 1)) + a;
- } while(L.findFrontOneBySelfCode(x) -> next != nullptr);
- L.insertToStartByCode(x);
- cout << "存包密码为:" << x << endl;
- L.printList();
- }
- void get(LinkList<int> &L){
- if(L.length() == 0) {
- cout << "当前无包裹." << endl;
- return;
- }
- int x = 0;
- cout << " 请输入密码:";
- cin >> x;
- if(x == 0) return;
- Node<int> *foundItem = L.deleteByCode(x);
- if(foundItem == nullptr) {
- cout << "取件码错误, 取件失败, 取消重试请输入0.\n";
- get(L);
- } else {
- cout << "取件成功.";
- delete foundItem;
- }
- L.printList();
- }
- void clearList(LinkList<int> &L) {
- cout<<"当前存包柜使用数量:" << L.length() << endl;
- L.deleteAll();
- cout<<"用户删除完成。\n";
- cout<<"当前存包柜使用数量:" << L.length() << endl;
- }
- void displayList(LinkList<int> &L) {
- cout<<"当前存包柜使用数量:" << L.length() << endl;
- L.printList();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement