C語言指標、連結串列與檔案操作詳解
/*首先是檔案包含,這裡就不使用 ifndef 那樣常規寫一個頭檔案*/
#include
#include
#include
#include
#include
/*接下來就是結構體*/
/*每一種商品對應一個結點,用連結串列連線起來,統一寫入檔案,或者從檔案中讀取*/
typedef struct commodity
{
int data; //頭結點data統計個數,其餘為商品編號
char name[20]; //名稱
double price; //價格
int count; //數量
double sum; //總計,頭結點sum為所有商品總計
struct commodity *next;
} *LinkList, LNode;
/*定義全域性變數,方便使用*/
/*連結串列頭指標*/
LinkList H = NULL;
/*檔案指標*/
FILE *fp = NULL;
/*函式宣告*/
/***************顯示函式****************/
//歡迎介面
void welcome();
//顯示選單
void menu();
//打印表格頭
void printf_header();
//顯示單個結點資訊
void printf_linklist_info(LinkList pTemp);
//延時函式
void delay();
/***********連結串列檔案操作函式*****************/
//從檔案中讀取到連結串列中
void Load_LinkList(LinkList H);
//將連結串列儲存到檔案中
void Save_LinkList(LinkList H);
/***************連結串列函式**********************/
//建立頭結點
void Creat_LinkList();
//新增結點到連結串列尾部
LinkList Add_LinkList(LinkList H);
//輸入結點資料
void Scanf_LinkList(LinkList pTemp);
//找到符合要求的結點的前驅
LinkList Find_LinkList_Pos(LinkList H,int index);
//找到符合要求的結點的地址
LinkList Find_LinkList_Val(LinkList H, char *name);
//刪除指定結點
void Del_LinkList(LinkList H, char *name);
//修改結點內容
void Modify_LinkList(LinkList H, int index, int data);
//順序輸出
void Printf_LinkList(LinkList H);
//釋放記憶體
void Free_LinkList(LinkList H);
/*main函式,沒什麼說的,除了getch函式用的時候會方便一些*/
int main()
{
LinkList pTemp = NULL;
char name[20] = {0};
system("color A");
//welcome();
Creat_LinkList();
Load_LinkList(H);
while(1)
{
system("cls");
menu();
switch(getch())
{
case '1':
pTemp = Add_LinkList(H);
Scanf_LinkList(pTemp);
getch();
break;
case '2':
printf_header();
Printf_LinkList(H);
getch();
break;
case '3':
printf("\n輸入名稱查詢:");
scanf("%s", name);
pTemp = Find_LinkList_Val(H, name);
printf_linklist_info(pTemp);
getch();
break;
case '4':
printf("\n請先輸入名稱查詢:");
scanf("%s", name);
pTemp = Find_LinkList_Val(H, name);
Scanf_LinkList(pTemp);
getch();
break;
case '5':
printf("\n請先輸入名稱查詢:");
scanf("%s", name);
Del_LinkList(H, name);
getch();
break;
case '6':
Save_LinkList(H);
printf("\n成功儲存%d條資訊!\n", H->data);
getch();
break;
case '0':
printf("\n歡迎下次使用!\n");
exit(0);
default :
printf("錯誤輸入!");
getch();
}
}
return 0;
}
////////////////////下面是顯示函式實現內容
/*歡迎介面,其實不要也可以*/
void welcome()
{
int i;
for(i=1 ; i<=100 ; i++)
{
printf("*******************歡迎使用本系統*************************");
printf("\n\n\n\n\n\n\n");
printf(" 載入中");
printf("...\n");
printf(" %3d%%\n",i);
printf("**********************************************************");
system("cls");
}
return ;
}
/*選單函式*/
void menu()
{
system("cls");
printf(" 歡迎進入本系統 \n");
printf("\n");
printf("-------------------------------------------------------------------\n");
printf("| 1 新增商品 |\n");
printf("| 2 顯示商品 |\n");
printf("| 3 查詢商品 |\n");
printf("| 4 修改商品 |\n");
printf("| 5 刪除商品 |\n");
printf("| 6 儲存修改 |\n");
printf("| 0 退出系統 |\n");
printf("-------------------------------------------------------------------\n");
printf(" 提示:退出前請先儲存!");
printf("\nchoose(0-8):");
}
/*以表格的形式列印所有商品資訊*/
void printf_header()
{
system("cls");
printf("-------------------------您的所有庫存-------------------------------------\n");
printf("| 編號 | 名稱 | 價格 | 數量 | 總計 |\n");
printf("|----------|---------------|---------------|----------------|------------|\n");
}
/*顯示單個結點資訊*/
void printf_linklist_info(LinkList pTemp)
{
if(pTemp == NULL)
{
return ;
}
printf_header();
pTemp->sum = pTemp->price * pTemp->count;
printf("|%10d|%15s| %lf |%20d| %lf |\n",pTemp->data, pTemp->name, pTemp->price, pTemp->count, pTemp->sum);
printf("|----------|---------------|---------------|----------------|------------|\n");
return ;
}
/*延時函式,寫完了發現我一直用的是getch等待按鍵*/
void delay()
{
long int i,j;
for(i=500000 ; i>0 ; i--)
{
for(j=0 ; j<=2000 ; j++);
}
}
/*建立頭結點*/
void Creat_LinkList()
{
H = (LinkList)malloc(sizeof(LNode));
if(H)
{
H->next = NULL;
H->data = 0;
}
return ;
}
/*新增結點,這裡是直接用最後一個節點的next申請記憶體*/
LinkList Add_LinkList(LinkList H)
{
LinkList q = H;
while(q->next != NULL)
q = q->next;
q->next = (LinkList)malloc(sizeof(LNode));
q->next->sum = 0;
q->next->next = NULL;
H->data++;
return q->next;
}
/*用於新增結點時輸入結點資訊,或者修改時輸入*/
void Scanf_LinkList(LinkList pTemp)
{
if(pTemp == NULL)
{
相關推薦
C語言指標、連結串列與檔案操作詳解
用兩個函式 Load_LinkList() 和 Save_LinkList() 讓連結串列與檔案操作結合,除了列印函式,其他都是在記憶體中操作連結串列,這樣寫更有條理,在建立連結串列時沒有采用書上的用一箇中間變數引導,並插入到結點前面,而是直接在連結串列尾的next申請記憶
《C語言》環形連結串列與《約瑟夫問題》
環形連結串列與《約瑟夫問題》 Main.c A_List.h A_List.c Main.c #include "A_List.h" #include <time.h> void main() { /*********
學習C語言指標和連結串列的體會
題目:C語言指標和連結串列 一、指標 什麼是指標?什麼是記憶體地址?什麼叫做指標的取值?指標是一個儲存計算機記憶體地址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數地址,例如int、long和double。指標也可以是void型
資料結構(c語言)——雙向連結串列的基本操作
定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struct DulNode *
資料結構(c語言)--雙向連結串列的基本操作
定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struc
c語言實現雙向連結串列的基本操作
雙向連結串列,又可以稱為雙向迴圈連結串列。 雙向連結串列中插入刪除操作的詳細解析可以看這篇文章:雙鏈表,下面是個人寫的簡單程式碼,僅供參考。#include<stdio.h> #include<stdlib.h> struct DulNode {
C語言學習系列——文件讀寫操作詳解
記錄 源程序 8.4 lib 令行 stdio.h 空串 表示 參數 當文件按指定的工作方式打開以後,就可以執行對文件的讀和寫。下面按文件的性質分類進行操作。針對文本文件和二進制文件的不同性質,對文本文件來說,可按字符讀寫或按字符串讀寫;對二進制文件來說,可進行
C語言利用連結串列與檔案實現登入註冊
C語言實現簡登入和註冊功能 C語言實現註冊登入 使用連結串列 使用檔案 版本二:利用連結串列 此版本使用的連結串列,第一個版本使用的是陣列 陣列版本連線 這裡我使用的線性連結串列,一定要注意在判斷語句或賦值語句中不可將指標指向未定義的區域,這會產生很大問題,所以
C語言的指標、連結串列的原理和各類操作
一、指標 1、運用指標 什麼是指標?什麼是記憶體地址?什麼叫做指標的取值?指標是一個儲存計算機記憶體地址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數地址,例如int、long和double。指標也可以
(C語言版)連結串列(一)——實現單向連結串列建立、插入、刪除等簡單操作(包含個人理解說明及註釋,新手跟著寫程式碼)
我學習了幾天資料結構,今天下午自己寫了一個單向連結串列的程式。我也是新手,所以剛開始學習資料結構的菜鳥們(有大牛們能屈尊看一看,也是我的榮幸)可以和我一起共同學習、討論,當然也很高興能指出我的錯誤,因為這是我們一起成長的過程。本程式碼包含我在寫程式時的一些個人理解的說
C語言_動態連結串列的簡單建立與節點刪除
程式詳解: 1、輸入學生的姓名和年齡,進行順序排列。 2、刪除其中某位學生的資料 #include<stdio.h> #include<stdlib.h> #include<string.h> #define
(C語言版)連結串列(四)——實現雙向迴圈連結串列建立、插入、刪除、釋放記憶體等簡單操作
雙向迴圈連結串列是基於雙向連結串列的基礎上實現的,和雙向連結串列的操作差不多,唯一的區別就是它是個迴圈的連結串列,通過每個節點的兩個指標把它們扣在一起組成一個環狀。所以呢,每個節點都有前驅節點和後繼節點(包括頭節點和尾節點)這是和雙向連結串列不同的地方。我們看下雙向迴圈連結
1、連結串列與陣列、時間複雜度、空間複雜度
1、記憶體中開闢空間: C語言中:全域性、域、堆空間(malloc/new) 組織形式: a、連續記憶體空間:申請一個數組,申連續記憶體 b、分散空間:申請次數無
約瑟夫環(使用C語言單向迴圈連結串列來解決)
題目描述 編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有一個密碼(正整數)。一 開始任選一個正整數m作為報數上限值,從第一個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那 個人出列,將他的密碼作為新的m值,從他順時針方向的下一個人開始重新從1報數,
C語言之單迴圈連結串列
#include<stdio.h> #include<stdlib.h> struct node { int data; &
C語言資料結構——連結串列
轉自https://www.cnblogs.com/chenxiaohei/p/6862791.html /* 連結串列節點的插入與刪除 編譯環境:VC++ 6.0 編譯系統:windows XP SP3 */ #inc
C資料結構-優化連結串列與鏈隊
優化連結串列與鏈隊 筆者上一個版本的連結串列,在尾部插入或刪除的操作時,需要使用for迴圈挪動到尾部,這樣時間複雜度就位O(n)。再用其來實現鏈隊的話,那麼鏈隊的入隊和出隊的時間複雜度也會因此受限。如果在連結串列中加入一個指標,指向尾部元素。那麼這個問題就可以迎刃而解。下面是優化過後的
演算法精解(一):C語言描述(連結串列)
1.連結串列認知 一場病,斷了好久。這幾天算是基本沒什麼問題了。是時候繼續了。 連結串列我想可以認為是,點到線的過程。 一個個點就是一個個連結串列的節點,以特定的順序組合或連結後,行成了一條線,即連結串列。所以新增,刪除一個點是相對較容易的(因為可以動態的追加,刪除節點),但
C語言簡單運用連結串列實驗程式碼
實驗一 (創新性)利用指標實現小學生數學四則運算小軟體 1.實驗內容 利用函式指標、指標函式、陣列指標以及指標陣列完成小學生數學四則運算小軟體,具體要求如下: 1)要具有自動批改功能。 2)要具有統計已完成題目數量和正確率功能。 3)要具有錯題記錄和回放功能。 4)參與運算的資料範圍可以由使
C語言資料結構----連結串列(靜態連結串列)
看了老唐的靜態連結串列,越發的覺得自己是菜鳥了,因為看的過程實在是太糾結了。下面就把自己看老唐靜態連結串列的內容寫下來。 一、靜態連結串列的基礎知識 1.單鏈表的缺陷:單鏈表的實現嚴重依賴指標,每一個數據元素都要有額外的指標域。 2.在靜態表中我們把資料元素放在一個數組裡,