1. 程式人生 > >C語言指標、連結串列與檔案操作詳解

C語言指標、連結串列與檔案操作詳解

用兩個函式 Load_LinkList() 和 Save_LinkList() 讓連結串列與檔案操作結合,除了列印函式,其他都是在記憶體中操作連結串列,這樣寫更有條理,在建立連結串列時沒有采用書上的用一箇中間變數引導,並插入到結點前面,而是直接在連結串列尾的next申請記憶體,便於理解,操作也方便。
  /*首先是檔案包含,這裡就不使用 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.在靜態表中我們把資料元素放在一個數組裡,