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

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

 

#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; }

 

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

 

显示火车票信息的示意图指针

 

相关文章
相关标签/搜索