博客
关于我
零基础学C/C++195——记录信息
阅读量:546 次
发布时间:2019-03-09

本文共 3494 字,大约阅读时间需要 11 分钟。

这里展示一个利用动态链表实现逆序存储和输出学生信息的实例。通过操作链表结构,我们将学生信息按输入顺序倒序打印出来。

链表数据结构

我们定义了一个学生节点结构,每个节点包含以下各项信息:

  • 学号(字符型,长度不超过20个字符)
  • 姓名(字符型,长度不超过40个字符)
  • 性别(一个字母,'f'或'm')
  • 年龄(整数)
  • 成绩(整数)

节点结构如下:

typedef struct stu {
char num[100];
char name[100];
char sex;
int old;
int sco;
struct stu *next;
} Node;

节点的创建

使用malloc函数分配内存空间,并通过strcpy函数初始化节点信息。创建函数的实现如下:

Node* Creat(char* m_num, char* m_name, char m_sex, int m_old, int m_sco) {
Node* p = (Node*)malloc(sizeof(Node));
strcpy(p->num, m_num);
strcpy(p->name, m_name);
p->sex = m_sex;
p->old = m_old;
p->sco = m_sco;
p->next = NULL;
return p;
}

逆序插入

将新的节点插入链表的第一位置,以实现逆序的效果。插入函数的实现如下:

Node* Insert(Node* head, Node* add) {
if (head == NULL) return add;
add->next = head;
head = add;
return head;
}

链表输出

遍历链表从第一个节点打印到最后一个节点。输出函数的实现如下:

void Print(Node* head) {
while (head != NULL) {
cout << head->num << " ";
cout << head->name << " ";
cout << head->sex << " ";
cout << head->old << " ";
cout << head->sco << endl;
head = head->next;
}
}

主函数逻辑

在main函数中,依次读取输入,构造节点并将节点插入链表的顶部。具体实现如下:

int main() {
char m_num[50];
char m_name[100];
char m_sex = '0';
int m_old = 0, m_sco = 0;
Node* head = NULL;
while (cin >> m_num) {
if (strcmp(m_num, "end") != 0) {
cin >> m_name >> m_sex;
cin >> m_old >> m_sco;
Node* add = Creat(m_num, m_name, m_sex, m_old, m_sco);
head = Insert(head, add);
} else {
goto ca;
}
}
ca:
Print(head);
Destory(head);
return 0;
}

完全代码结构

  • 头文件包含
    #include 
    #include
    #include
    #include
    using namespace std;
  • 节点结构定义
    typedef struct stu {
    char num[100];
    char name[100];
    char sex;
    int old;
    int sco;
    struct stu *next;
    } Node;
  • 节点创建函数
    Node* Creat(char* m_num, char* m_name, char m_sex, int m_old, int m_sco) {
    Node* p = (Node*)malloc(sizeof(Node));
    strcpy(p->num, m_num);
    strcpy(p->name, m_name);
    p->sex = m_sex;
    p->old = m_old;
    p->sco = m_sco;
    p->next = NULL;
    return p;
    }
  • 逆序插入函数
    Node* Insert(Node* head, Node* add) {
    if (head == NULL) return add;
    add->next = head;
    head = add;
    return head;
    }
  • 链表输出函数
    void Print(Node* head) {
    while (head != NULL) {
    cout << head->num << " ";
    cout << head->name << " ";
    cout << head->sex << " ";
    cout << head->old << " ";
    cout << head->sco << endl;
    head = head->next;
    }
    }
  • 链表销毁函数
    void Destory(Node* head) {
    if (head != NULL) {
    Destory(head->next);
    free(head);
    }
    }
  • 主函数
    int main() {
    char m_num[50];
    char m_name[100];
    char m_sex = '0';
    int m_old = 0, m_sco = 0;
    Node* head = NULL;
    while (cin >> m_num) {
    if (strcmp(m_num, "end") != 0) {
    cin >> m_name >> m_sex;
    cin >> m_old >> m_sco;
    Node* add = Creat(m_num, m_name, m_sex, m_old, m_sco);
    head = Insert(head, add);
    } else {
    goto ca;
    }
    }
    ca:
    Print(head);
    Destory(head);
    return 0;
    }

样例输入与输出

  • 输入样例
    20170210 zhangsan f 16 100
    20170140 wangyuan m 15 98
    20170118 lisi f 14 65
    20170928 zhaojing m 15 99
    end
  • 输出样例
    20170928 zhaojing m 15 99
    20170118 lisi f 14 65
    20170140 wangyuan m 15 98
    20170210 zhangsan f 16 100

通过这个实例,可以看出利用动态链表的方式能够高效地处理逆序数据输出的需求。这个解决方案充分发挥了链表数据结构的优势,实现了数据的高效插入和输出操作。

转载地址:http://oyoiz.baihongyu.com/

你可能感兴趣的文章
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>
MySQL I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>
MySQL in 太多过慢的 3 种解决方案
查看>>
MySQL InnoDB 三大文件日志,看完秒懂
查看>>
Mysql InnoDB 数据更新导致锁表
查看>>
Mysql Innodb 锁机制
查看>>
MySQL InnoDB中意向锁的作用及原理探
查看>>
MySQL InnoDB事务隔离级别与锁机制深入解析
查看>>
Mysql InnoDB存储引擎 —— 数据页
查看>>
Mysql InnoDB存储引擎中的checkpoint技术
查看>>
Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
查看>>
MySQL InnoDB引擎的锁机制详解
查看>>
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>