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


以下程序只是作為一個簡單的示例:(火車票訂票系統)

 

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

 

添加火車票信息的示意圖:

 

顯示火車票信息的示意圖

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM