使用单向链表保存大量数据的基础程序框架

以下程序只是作为一个简单的示例:(火车票订票系统)

 

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*************************************预编译模块***************************************************/
#define  HEADER1 "|------------------------------book ticket sys--------------------------------|\n"
#define  HEADER2 "|  number  |start city|reach city|takeoffTime|reach time|  price   |ticketNum |\n"
#define  HEADER3 "|-----------------------------------------------------------------------------|\n"
#define  FORMAT  "|%-10s|%-10s|%-10s|%-11s|%-10s|%-10.2f|%-10d|\n"   //除了takeoffTime这一项,为保持上下对齐的美观,其它项数据都固定只占10位的长度

//定义火车票信息结构体
typedef struct _ticket
{
    char number[10]; //火车票的车次
    char startCity[10]; //火车票的出发城市
    char reachCity[10]; //火车票的到达城市
    char takeoffTime[10]; //火车票的出发时间
    char reachTime[10]; //火车票的到达时间
    float price; //火车票的票价
    int ticketNum; //火车票的剩余票数
}ticket;

//定义单向链表节点
typedef struct _node
{
    void *dat; //一般为结构体指针
    int size; //dat指向区域的大小,一般为结构体的大小
    struct _node *next; //后继节点
}node;

node *g_ticketList = NULL;

/*************************************链表模块***************************************************/
//创建链表
node *createList(int size)
{
    node *head = (node *)malloc(sizeof(node)); //给链表头结点分配内存空间
    if(!head)
    {
        printf("listHead malloc error!\n");
        return NULL;
    }

    head->dat = NULL; //链表头结点不存储数据,故指向NULL
    head->size = size; //链表的size一般为结构体的大小[size == sizeof(ticket)]
    head->next = NULL;

    return head;
}

//插入数据到链表尾节点后
int insertData_toListTail(node *head,void *dat)
{
    node *tmpNode = (node *)malloc(sizeof(node)); //定义一个存储插入数据的临时节点,插入该节点就相当于插入数据了
    if(!tmpNode)
    {
        printf("tmpNode malloc error!\n");
        return NULL;
    }

    //给临时节点的数据指针dat分配内存空间
    tmpNode->dat = malloc(sizeof(head->size)); //dat的类型一般为struct *,所以不再进行(void *)的强制类型转换
    if (!tmpNode->dat)
    {
        printf("tmpNode->dat malloc error!\n");
        return NULL;
    }
    tmpNode->dat = dat; //将要插入的数据保存在临时节点内
    tmpNode->size = head->size;

    node *cur = head; //定义当前节点
    while(cur->next)    //找到尾节点 [若链表只有一个头节点,则头节点就是尾节点]
    {
        cur = cur->next;
    }

    //将保存要插入数据的临时节点,插入到尾节点后
    cur->next = tmpNode;
    tmpNode->next = NULL; //此时,tmpNode变为尾节点
}

/*************************************火车票模块***************************************************/
//添加火车票,并保存在火车票信息链表中
int addTicket_toList(node *head)
{
    ticket *tmpTicket = (ticket *)malloc(sizeof(ticket)); //定义火车票信息的临时结构体指针
    if (!tmpTicket)
    {
        printf("tmpTicket malloc error!\n");
        return -1;
    }

    printf("请输入火车票的车次:");
    scanf("%s",tmpTicket->number);
    printf("请输入火车票的出发城市:");
    scanf("%s",tmpTicket->startCity);
    printf("请输入火车票的到达城市:");
    scanf("%s",tmpTicket->reachCity);
    printf("请输入火车票的出发时间:");
    scanf("%s",tmpTicket->takeoffTime);
    printf("请输入火车票的到达时间:");
    scanf("%s",tmpTicket->reachTime);
    printf("请输入火车票的票价:");
    scanf("%f",&tmpTicket->price);
    printf("请输入火车票的剩余票数:");
    scanf("%d",&tmpTicket->ticketNum);

    insertData_toListTail(head,tmpTicket); //插入火车票信息数据,到火车票信息链表尾节点后

    return 0;
}

//显示火车票信息链表中的所有节点数据
int showTicketList_allData(node *head)
{
    if(!head->next) //检测链表是否只有一个节点
    {
        printf("list only have one node,error!\n"); //链表只有一个节点,则打印错误信息,并返回
        return -1;
    }

    ticket *tmpTicket = (ticket *)malloc(sizeof(ticket)); //定义火车票信息的临时结构体指针
    if (!tmpTicket)
    {
        printf("tmpTicket malloc error!\n");
        return -1;
    }

    printf(HEADER1); //打印输出头信息
    printf(HEADER2);
    printf(HEADER3);
    for(node *cur=head->next;cur!=NULL;cur=cur->next) //由于头节点不保存数据,所以从第二个节点开始显示数据
    {
        tmpTicket = (ticket *)cur->dat; //将节点数据取出来,赋给临时结构体指针
        printf(FORMAT,tmpTicket->number,tmpTicket->startCity,tmpTicket->reachCity,tmpTicket->takeoffTime,tmpTicket->reachTime,tmpTicket->price,tmpTicket->ticketNum);
    }

    return 0;
}

void menu()
{
    printf("1. add ticket information    \n");
    printf("5. show ticket information   \n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    int sel = 0;

    g_ticketList = createList(sizeof(ticket)); //创建火车票信息链表

    do 
    {
        menu(); //显示菜单选项
        printf("请输入你的选项:");
        scanf("%d",&sel);

        switch(sel)
        {
            case 1:
            {
                addTicket_toList(g_ticketList); //添加火车票信息,到火车票链表中
                system("PAUSE"); //暂停
            }
            break;

            case 5:
            {
                showTicketList_allData(g_ticketList); //显示火车票信息链表中的所有节点数据
                system("PAUSE"); //暂停
            }
            break;
        }
        system("CLS"); //清屏
    } while (sel!=7);


    return 0;
}

 

添加火车票信息的示意图:

 

显示火车票信息的示意图

 

 

posted @ 2018-09-27 23:32  fengMisaka  阅读(1341)  评论(0编辑  收藏  举报