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