使用單向鏈表保存大量數據的基礎程序框架

如下程序只是做爲一個簡單的示例:(火車票訂票系統)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

 

顯示火車票信息的示意圖指針

 

相關文章
相關標籤/搜索