首页 > 技术文章 > 动态链表学习——实践

Serenaxy 2019-03-04 17:17 原文

    学习有些紧张(我的天,一开学就那么累),都没有时间写博客了,这两天学习了动态链表的知识,于是利用这个知识写了一个表(可以统计学生信息——如学号,姓名,成绩),没有时间说自己的思路了,只能直接放上代码作为学习记录(以后有时间会写更好的,并且把思路详细写出)。我这个程序比较低级,大佬勿喷。
效果图:


代码如下(编译环境:VC++):

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
struct node {
    int number;
    string name;
    double score;
    node * next;
};
class list {
private:
    node *head;
    int count;
    int selMode(); //选择模式
    void display();//显示
    void insert(); //插入操作
    void remove(); //删除操作
    void clear();  //释放所有动态数据

public:
    list() {        //构造函数
        head = NULL;
        count = 0;
    } 
    ~list() {       //解析函数
        clear();
    }
    void play() {   //执行函数
        while (1) {
            int i = selMode();
            if (i == 1)
                display();
            else if (i == 2)
                insert();
            else
                remove();
        }
    }
};
int list::selMode() {
    system("cls");
    cout << "1: 显示" << endl;
    cout << "2: 插入" << endl;
    cout << "3: 删除" << endl;
    cout << "4: 退出" << endl;;
    while (1) {
        int k;
        cin >> k;
        if (k == 4) {
            exit(1);
        }
        else if (k < 1 || k > 4) {
            cout << "非法输入,请重新输入!" << endl;
        }
        else
            return k;
    }
}
void list::display() {
    system("cls");       //清屏
    cout << "总学生数 :" << count << endl;
    cout << "学号   " << "姓名    " << "分数" << endl;
    //输出具体数据
    if (head == NULL)
        cout << "无数据" << endl;
    else {
        node *k = head; 
        while (k!= NULL) { 
            cout << k->number << "   " << k->name << "   " << k->score << endl;
            k = k->next;
        }
    }
    cout << "返回请输入一个键:";
    int k;
    cin >> k;
}
void list::insert() {
    system("cls");
    while (1) {
        node *p = new node;
        cout << "请输入该学生学号:";
        cin >> p->number;
        if (p->number <= 0)       //输入值小于等于0代表返回操作
            break;
//具体插入操作(需要分类讨论)
        //链表为空
        if (head == NULL) {       
            p->next = NULL;
            head = p;
        }
        //链表不为空
        else if (head->number >= p->number) { //第一个节点的学号大于等于插入节点的学号
            if (head->number > p->number) {//大于
                p->next = head;
                head = p;
            }
            else {//等于
                cout << "重复学号,请重新输入" << endl;
                continue;
            }
        }
        else {                              //第一个节点的学号小于插入节点的学号
            node * a = head;
            node * b = a->next;
            while (b != NULL && b->number < p->number) {//找出特殊的节点
                a = b;
                b = b->next;
            }
            if (b == NULL || b->number > p->number) {
                a->next = p;
                p->next = b;
            }
            else {
                cout << "重复学号,请重新输入" << endl;
                continue;
            }
        }
        cout << "请输入该学生的姓名:";
        cin >> p->name;
        cout << "请输入该学生的分数:";
        cin >> p->score;
        cout << endl;
        count++;
    }
}
void list::remove() {
    system("cls");
    while (1) {
        cout << "请输入所要删除学生的学号:";
        int pos; //要删除的学生学号;
        cin >> pos;
        if (pos <= 0)      //小于等于0代表返回操作
            break;
        if (head == NULL) {
            cout << "列表为空,请输入任意键返回";
            int k;
            cin >> k;
            break;
        }
        else {
            if (head->number == pos) {
                node *p = head;
                head = p->next;
                delete p;
                count--;
            }
            else {
                node *k = head;
                while (k->next != NULL && (k->next)->number != pos) {
                    k = k->next;
                }
                if (k->next == NULL)
                    cout << "该学号不在此列表中,请重新输入" << endl;
                else {
                    node *p = k->next;
                    k->next = p->next;
                    delete p;
                    count--;
                }
            }
        }
    }
}
void list::clear() {
    if (head != NULL) {
        node *p = head;
        while (p != NULL) {
            delete p;
            p = p->next;
        }
    }
}
int main() {
    list stu;
    stu.play();
    return 0;
}

 

推荐阅读