1. 程式人生 > >用c語言實現簡易通訊錄(連結串列)

用c語言實現簡易通訊錄(連結串列)

首先,這是本人第一次寫部落格。不當之處,望請見諒!(腦補一個doge)
最近在學習C語言,並實現了 下面連結中 簡易通訊錄的功能。區別是:我是用連結串列實現了其所有功能。並增加了檔案儲存模組!
本人初來乍到,c功底不是很紮實,且是第一次用c寫小專案,雖然實現了所有功能,但程式碼中定會有很多需優化的地方。所以,各位希望不吝賜教!萬分感謝!

https://blog.csdn.net/iconm/article/details/80380406

下面開始啦:

標頭檔案:

# ifndef   __TONGXUNLU_H
# define   __TONGXUNLU_H

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define LEN  sizeof(address_list) //開闢空間

int n=0;//記錄通訊錄人員人數

typedef struct A
{
    char name[100];//名字
    char sex[5];//性別
    char  age[10];//年紀
    char phone[15];//電話
    char addr[100];//地址
    struct A *next;  
}address_list;

void show_feature(void);//選單函式
address_list * add(address_list *);//新增聯絡人
address_list * delete1(address_list *);//刪除特定聯絡人
void show_list(address_list *);//顯示所有聯絡人
void find_list(address_list *);//尋找特定聯絡人
address_list * sort(address_list *);//排序聯絡人
address_list * clear_list(address_list *);//清楚所有聯絡人
address_list * revision_list(address_list *);//修改特定聯絡人特定資訊
void save_list(address_list *);//儲存所有聯絡人資訊
void exit_list();//退出通訊錄系統
# endif // __TONGXUNLU_H

主功能原始碼:

#include "tongxunlu.h"

int main()
{
  int func;
  address_list *p1;
  p1 = (address_list *)malloc(LEN);
  //printf("%d",p1->next);
  do
  {
    show_feature();//選單函式
    printf("請選擇您要進行的操作:");
    scanf("%d" ,&func);
    fflush(stdin);
    switch(func)
    {
      case 1:  p1=add(p1); break;//新增
      case 2:  p1=delete1(p1); break;//刪除
      case 3:  find_list(p1); break;//查詢
      case 4:  revision_list(p1); break;//修改
      case 5:  show_list(p1); break;//顯示
      case 6:  p1=clear_list(p1); break;//清除
      case 7:  p1=sort(p1); break;//排序
      case 8:  save_list(p1); break;//儲存
      case 0:  exit_list(); break;//退出
     default:  printf("選擇錯誤,請重新輸入!\n"); break;
    }
  }while(func);
  return 0 ;
}

//修改特定聯絡人特定資訊
address_list * revision_list(address_list *head)
{
    char j[100],q[100],p[100];
    address_list *A1;
    A1 = (address_list *)malloc(LEN);
    printf("請輸入你想要修改的人的姓名:");
    scanf("%s",j);
    A1 = head;
    for (int i=1; i <= n; i++)
    {
        if(!(strcmp(j,A1->name)))
        {
            printf("成功找到 %s 的具體資訊:\n", A1->name);
            printf("名字:%4s,性別:%4s,年齡:%4s,電話:%4s,地址:%4s\n" ,A1->name,A1->sex,A1->age,A1->phone,A1->addr);
            printf("你想要修改%s的什麼資訊(name, sex, age, phone, addr):",j);
            scanf("%s",q);
            if((strcmp(q,"name"))&(strcmp(q,"sex"))&(strcmp(q,"age"))&(strcmp(q,"phone"))&(strcmp(q,"addr")))
                {printf("請輸入正確的想要修改的資訊!\n");break;}
            printf("你想要把 %s 的 %s 修改成:",j,q);
            scanf("%s",p);
            if(!(strcmp(q,"name")))strcpy(A1->name, p);
            if(!(strcmp(q,"sex")))strcpy(A1->sex, p);
            if(!(strcmp(q,"age")))strcpy(A1->age, p);
            if(!(strcmp(q,"phone")))strcpy(A1->phone, p);
            if(!(strcmp(q,"addr")))strcpy(A1->addr, p);
                //A1->name = "x";這樣賦值是不行滴!!
            printf("成功把 %s 的 %s 修改為 %s!!!\n", j,q,p);break;
        }
        else
        {
            if(A1->next == NULL) printf("沒有找到%s的資訊!\n",j);
            A1 = A1->next;
        }
    }
    return head;
}
//清除聯絡人資訊
address_list * clear_list(address_list *head)
{
    head = NULL;
    n = 0;
    printf("已清除全部通訊錄資訊!!\n");
    return head;
}
//尋找特定聯絡人資訊
void find_list(address_list *head)
{
    char j[100];
    address_list *A1;
    A1 = (address_list *)malloc(LEN);
    printf("請輸入你要查詢人的姓名:");
    scanf("%s",j);
    A1 = head;
    for (int i=1; i <= n; i++)
    {
        if(!(strcmp(j,A1->name)))
        {
            printf("%s 的具體資訊是:\n", A1->name);
            printf("名字:%4s,性別:%4s,年齡:%4s,電話:%4s,地址:%4s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
            break;
        }
        else
        {
            if(A1->next == NULL) printf("沒有找到%s的資訊\n",j);
            A1 = A1->next;
        }
    }
    //free(A1);
}
//刪除某通訊錄成員資訊
address_list * delete1(address_list *head1)
{
   char j[100];
   int i;
   address_list *p1,*p2,*p3,*p4;
   p1=p2=p3=p4=(address_list *)malloc(LEN);
   if (n == 0)
   {
       printf("There is no any data!");
       goto END;
   }
   else
   {
       p1=p2=head1;
       p4=head1->next;//p4的作用:當刪除的是連結串列第一個資料時候。
       printf("Please enter the name that you want to delete:");
       scanf("%s",j);
       //遍歷連結串列,尋找要刪除的資料
       if(!(strcmp(j,head1->name)))//刪除資料是否為第一個連結串列
        {
            if(n==1)
            {
                head1 = NULL;
                printf("刪除成功!\n");
                printf("現在通訊表沒有任何資訊,請新增或退出!\n");
            }
            else
            {
               head1=p4;
               printf("刪除成功!");
            }
        }
       //遍歷連結串列尋找要刪除的資訊(若p3在第一鏈,則p2在第二鏈,p1在第三鏈)
       for (i=1;i<=n;i++)
       {
           p1=p1->next;
           if(!(strcmp(j,p2->name)))
           {
               p3->next=p2->next;
               printf("刪除成功!");
               n--;
               goto END;
           }
           else
           {
               p3=p2;
               p2=p1;
           }
       }
   }
   printf("遍歷通訊錄,並未發現想要刪除的資訊!");
   END:return head1;
}
//按首字母從小到大排序聯絡人資訊
address_list * sort(address_list *head)
{
    if(n == 0)
    {
        printf("沒有資料,請新增!\n");
        return head;
    }
    else//能進入下面程式的,n>=2
    {
        char j[100];
        address_list *A1, *A2, *A3;
        A1 = A2 = A3 =(address_list *)malloc(sizeof(address_list));//這裡不開闢空間總會導致程式崩潰!
        printf("請選擇要排序的方式");
        printf("(name, sex, age, phone, addr):");
        scanf("%s" ,j);
        if((strcmp(j,"name"))&(strcmp(j,"sex"))&(strcmp(j,"age"))&(strcmp(j,"phone"))&(strcmp(j,"addr")))
        {printf("輸入有誤!請輸入正確的想要修改的資訊!\n");goto END;}
        //A1 = A2 = A3 = head;
        if(head->next == NULL)//檢測是否只有一組資料
        {
            printf("成功完成排序!\n");
            //show_list(head);
            return head;
        }
        else
        {
            for (int ii=1; ii<=n-1; ii++)
            {
               A1 = head->next;
               A2 = head;
               for (int jj=1; jj<=n-ii; jj++)
                {
                  if(jj == 2) {A3 = head;}
                  if(jj > 2) {A3 = A3->next;}
                  if(!(strcmp(j,"name")))  {if(strcmp(A2->name,A1->name)>0) goto Loop; else  goto Loop1;}
                  if(!(strcmp(j,"sex")))   {if(strcmp(A2->sex,A1->sex)>0) goto Loop; else  goto Loop1;}
                  if(!(strcmp(j,"age")))   {if(strcmp(A2->age,A1->age)>0) goto Loop; else  goto Loop1;}
                  if(!(strcmp(j,"phone"))) {if(strcmp(A2->phone,A1->phone)>0) goto Loop; else  goto Loop1;}
                  if(!(strcmp(j,"addr")))  {if(strcmp(A2->addr,A1->addr)>0) goto Loop; else  goto Loop1;}
                  Loop:{
                     if(jj == 1) {head = head->next;}
                     if(jj >= 2) {A3->next = A1;}
                     A2->next = A1->next;
                     A1->next = A2;
                     A1 = A1->next->next;
                     continue;
                     }
                  Loop1:{
                     A2 = A1;
                     A1 = A1->next;
                        }
            }
            //show_list(head);
        }
        printf("成功完成排序!\n");
        }
        END:return head;
      }
}

//新增通訊錄成員資訊
address_list * add(address_list *head)
{
    int i;
    address_list *A1, *A2, *A3;
    A1 = A2 = A3 =(address_list *)malloc(sizeof(address_list));//這裡不開闢空間總會導致程式崩潰!
    A1 = head;
    if(n==0)
    {
        printf("新增通訊錄成員\n");
        printf("請輸入名字:");
        scanf("%s",A2->name);
        printf("請輸入性別:");
        scanf("%s",A2->sex);
        printf("請輸入年齡:");
        scanf("%s",A2->age);
        printf("請輸入電話:");
        scanf("%s",A2->phone);
        printf("請輸入地址:");
        scanf("%s",A2->addr);
        printf("新增成功!\n");
        A2->next = NULL;
        head = A2;
    }
    else
    {
        for (i=1; i<=n; i++)
        {
           if(A1->next == NULL)
            {
               A1->next = A3;
               printf("\n新增通訊錄成員\n");
               printf("請輸入名字:");
               scanf("%s",A3->name);
               printf("請輸入性別:");
               scanf("%s",A3->sex);
               printf("請輸入年齡:");
               scanf("%s",A3->age);
               printf("請輸入電話:");
               scanf("%s",A3->phone);
               printf("請輸入地址:");
               scanf("%s",A3->addr);
               printf("新增成功!\n");
               A3->next = NULL;
            }
            A1 = A1->next;
        }
    }
    n++;
    //free(A1);free(A2);free(A3);//釋放之後結果就不對了!
    //printf("%d",head->next);
    return head;
}

//顯示已存在通訊表資訊
void show_list(address_list *head)
{
    int i;
    address_list *A1;
    A1 = (address_list *)malloc(sizeof(address_list));//這裡不開闢空間總會導致程式崩潰!
    A1 = head;
    if (n == 0)
        printf("沒有資料,請新增!\n");
    else
    {
       printf("\n現在通訊錄中儲存 %d 個人的資訊!\n",n);
       for (i=1; i<=n; i++)
       {
          printf("名字:%4s,性別:%4s,年齡:%4s,電話:%4s,地址:%4s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
          A1 = A1->next;
       }
    }
   free(A1);
}
//儲存聯絡人資訊
void save_list(address_list *head)
{
    address_list *A1;
    A1 = (address_list *)malloc(sizeof(address_list));//這裡不開闢空間總會導致程式崩潰!
    A1 = head;
    FILE *fp;//檔案指標
    /*檔案的開啟*/
    char data_list[100];
    printf("請輸入想儲存的檔名稱(需帶檔案字尾):");
    scanf("%s",data_list);
    fp=fopen(data_list,"w");//fopen開啟檔案,這個檔案可以是當前不存在的。“w”以寫入的形式開啟,“r”以讀的形式開啟
    if(fp==NULL) //判斷如果檔案指標為空
    {
        printf("不能開啟檔案! " );
        //exit(0);//在以0的形式退出,必須在檔案開頭有#include <stdlib.h>,stdlib 標頭檔案即standard library標準庫標頭檔案
    }
    //寫入資料
    else
    {
       for (int i=1; i<=n; i++)
       {
           fprintf(fp, "名字:%6s,性別:%6s,年齡:%6s,電話:%6s,地址:%6s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
           A1 = A1->next;
       }
    printf("通訊錄資訊成功儲存至 %s 中!\n",data_list);
    }
    //關閉檔案
    fclose(fp);
    free(A1);
}

//顯示功能
void show_feature(void)
{
   printf("\n現在通訊錄中儲存 %d 個人的資訊!\n",n);
   printf("*********************************\n");
   printf("***1. 新增        2. 刪除********\n");
   printf("***3. 查詢        4. 修改********\n");
   printf("***5. 顯示        6. 清空********\n");
   printf("***7. 排序        8. 儲存********\n");
   printf("***0. 退出               ********\n");
   printf("*********************************\n");
}
//退出通訊錄系統
void exit_list()
{
    printf("歡迎您再次使用!");
    printf("\n已成功退出通訊錄系統!\n");
}

結果顯示:
在這裡插入圖片描述

完事收工!