天天看點

C語言通訊錄(利用連結清單實作)

頭檔案:

#ifndef _STRUCT_H_
#define _STRUCT_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int i;                                              //定義全局變量i

struct node
{
    int ID;
    char name[];
    char ismale[];
    char tel[];
    char qq[];
    char address[];
    char remark[];                                //儲存聯系人資訊
    struct node *next;                              //結構體類型的指針,儲存下一個結構體的位址
};

void clear();
void interface();
int insert_tail( struct node *header );
void printfcon( struct node *header, int j );
void list( struct node *header );
int findnum( struct node *header, char *s, int *accumlate );
void seek( struct node *header );
int coverdata( struct node *header, int j );
void mydelete( struct node *header );
void setid( struct node *header );
int modify( struct node *header, int j );
void revise( struct node *header );

#endif
           

清屏 :

#include "struct.h"

void clear()
{
    system("clear");                    //清屏
}
           

界面:

#include "struct.h"

void interface()                //界面函數,輸出主界面
{
    printf("            *********************************************************************************       \n");
    printf("            *                                       *               \n");
    printf("        *                                               *       \n");
    printf("        |                                               |       \n");
    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("        |                   ~~~~~~~~                    |       \n");
    printf("        |                                               |       \n");
    printf("        |功能:1.ADD、2.LIST、3.DELETE、4.SEEK、5.REVISE、6.EXIT                    |       \n");
    printf("        |請在下面輸入1、2、3、4、5、6選擇你的操作。                           |       \n");
    printf("        |                                               |       \n");
    printf("        *                                               *       \n");
    printf("            *                                       *               \n");
    printf("            *********************************************************************************       \n");
}
           

添加聯系人:

#include "struct.h"

int insert_tail( struct node *header )                                  //定義添加聯系人函數
{
    char c = ;
    struct node *temp = header;

    do
    {
        clear();
        struct node *p = (struct node *)malloc(sizeof(struct node));
        if( p == NULL )
        {
            printf("malloc error!\n");
            return -;
        }

        printf("請輸入聯系人姓名:");                                    //錄入聯系人資訊
        scanf("%s",p->name);

        printf("請輸入聯系人性别:");
        scanf("%s",p->ismale);

        printf("請輸入聯系人電話号碼:");
        scanf("%s",p->tel);

        printf("請輸入聯系人QQ号:");
        scanf("%s",p->qq);

        printf("請輸入聯系人家庭位址:");
        scanf("%s",p->address);

        printf("備注:");
        scanf("%s",p->remark);

        p->ID = i;  
        i++;                                                            //錄完後讓i++

        while( temp->next != NULL )
        {
            temp = temp->next;
        }
        temp->next = p;                                                 //找到最後一個結點,将結點p尾插進連結清單
        p->next = NULL;

        printf("是否繼續添加? (y/n) :");
        __fpurge(stdin);                                                //清除緩沖區
        c = getchar();

    }while( c == 'y' );                                                 //do while語句,當c不等于y時退出循環,即不再繼續添加
}
           

顯示聯系人清單:

#include "struct.h"

void list( struct node *header )                                //定義聯系人清單函數,輸出所有聯系人資訊
{
    clear();

    int j = ;

    for( j = ; j <= i; j++ )
    {
        printfcon( header, j );                                 // 調用printfcon函數,輸出每個聯系人的資訊
    }
}

void printfcon(struct node *header, int j)                      //定義列印單個聯系人資訊函數
{
    struct node *p = header;
    while( p->next != NULL )
    {
        p = p->next;
        if( p->ID == j )
        {
            printf("編号:%d\n",p->ID);                            //周遊連結清單,輸出ID為j的聯系人資訊
            printf("姓名:%s\n",p->name);
            printf("性别:%s\n",p->ismale);
            printf("電話:%s\n",p->tel);
            printf("QQ号:%s\n",p->qq);
            printf("位址:%s\n",p->address);
            printf("備注:%s\n",p->remark);
            printf("\n");
        }
    }
}
           

通過名字找到聯系人編号,傳回有幾個聯系人

#include "struct.h"

int findnum( struct node *header, char *s, int *accumlate )     //定義找到聯系人編号函數,找到編号存入數組accumlate
{
    int m = ;
    int j = ;
    struct node *p = header;

    for( m = ; m <= i; m++ )
    {
        if( strcmp( s, p->name ) ==  )
        {
            accumlate[j++] = p->ID;                             //比較字元串s和p->name,如果傳回值為0,代表相等,把p->ID存入數組
        }
        p = p->next;
    }

    return j;                                                   //傳回數組中有幾個值,即能找到幾個聯系人
}
           

查找聯系人:

#include "struct.h"

void seek( struct node *header )                                //定義查找函數,通過姓名查找
{
    char c = ;
    struct node *p = header;
    do
    {
        clear();

        int j = ;
        int temp = ;
        int accum = ;
        int a[] = {};
        char name[] = {};

        printf("請輸入你想查找的聯系人的姓名:");
        scanf("%s",name);

        accum = findnum( p, name, a );                          //調用findnum函數,并把找到幾個聯系人賦給accum

        if( accum ==  )
        {
            printf("此聯系人不存在!\n");
        }

        else if( accum ==  )                                   //如果找到一個聯系人,輸出這個聯系人的資訊
        {
            temp = a[];
            printfcon( p, temp );
        }

        else if( accum >  )                                    //找到不止一個聯系人,輸出全部聯系人資訊
        {
            printf("有%d個聯系人!\n",accum);
            for( j = ; j < accum; j++ )
            {
                temp = a[j];
                printfcon( p, temp );
            }
        }
            printf("是否繼續查找? (y/n) :");
            __fpurge(stdin);
            c = getchar();

    }while( c == 'y' );                                         //do while語句用來控制是否繼續查找,當輸入為y時繼續查找
}
           

删除聯系人:

#include "struct.h"

void mydelete( struct node *header )                            //定義删除聯系人函數
{
    char c = ;
    struct node *p = header;
    do
    {
        clear();

        int j = ;
        int temp = ;
        int accum = ;
        int a[] = {};
        char name[] = {};

        printf("請輸入你想删除的聯系人的姓名:");
        scanf("%s",name);

        accum = findnum( p, name, a );                          //調用findnum函數,并把找到幾個聯系人賦給accum

        if( accum ==  )
        {
            printf("此聯系人不存在!\n");
        }

        else if( accum ==  )
        {
            temp = a[];
            coverdata( p, temp );
        }

        else if( accum >  )
        {
            printf("有%d個聯系人!\n",accum);                 //如果找到不止一個聯系人,一個個輸出這些聯系人資訊,讓操作者選擇是否要删除
            for( j = ; j < accum; j++ )
            {
                temp = a[j];
                printfcon( p, temp );
                coverdata( p, temp );
            }
        }
        setid( p );

        printf("是否繼續删除? (y/n): \n");
        __fpurge(stdin);
        c = getchar();

    }while( c == 'y' );                                         //do while語句,用來控制是否繼續删除,隻有輸入y時才繼續删除
}

int coverdata( struct node *header, int j )                     //定義覆寫資訊函數
{
    printf("是否删除該聯系人?(y/n)\n");                 
    __fpurge(stdin);

    if( getchar() == 'y' )                                      //當輸入的字元為y時執行操作
    {
        struct node *prev = NULL;
        struct node *p = header;

        while( p->next != NULL )
        {
            prev = p;
            p = p->next;
            if( p->ID == j )
            {
                prev->next = p->next;
                printf("删除成功!\n");
                printf("\n");
                free(p);
                p = NULL;
                i--;
                return ;                                       //當ID等于j時,讓p前一個結點指向p後一個結點,釋放p,讓i-1
            }
        }
        printf("delete error!\n");
    }
}

void setid( struct node *header )
{
    struct node *p = header;
    int j = ;

    while( p->next !=NULL )
    {
        p = p->next;            //跳過頭結點或指向下一個結點
        p->ID = j++;            //重置每個結點的ID
    }
}
           

修改聯系人:

#include "struct.h"

void revise( struct node *header )                              //定義修改資訊函數
{   
    char c = ;
    struct node *p = header;
    do
    {
        clear();

        int j = ;
        int temp = ;
        int accum = ;
        int a[] = {};
        char name[] = {};

        printf("請輸入你想修改的聯系人的姓名:");
        scanf("%s",name);

        accum = findnum( p, name, a );

        if( accum ==  )
        {
            printf("此聯系人不存在!\n");
        }

        else if( accum ==  )
        {   
            temp = a[];
            printfcon( p, temp );
            modify( p, temp );
        }

        else if( accum >  )
        {
            printf("有%d個聯系人!\n",accum);
            for( j = ; j < accum; j++ )
            {
                temp = a[j];
                printfcon( p, temp );                           //有不止一個聯系人時一個個輸出聯系人資訊,讓其修改
                modify( p, temp );
            }
        }       
            printf("是否繼續修改? (y/n) :\n");
            __fpurge(stdin);
            c = getchar();

    }while( c == 'y' );                                         //do while語句用來控制是否繼續修改,當輸入y時繼續循環修改
}

int modify( struct node *header, int j )                        //定義修改函數
{
    int temp = ;
    int rev = ;
    struct node *p = header;
    while( p->next != NULL )
    {
        p = p->next;
        if( p->ID == j )
        {
            printf("1--姓名\n");
            printf("2--性别\n");
            printf("3--電話\n");
            printf("4--qq号\n");
            printf("5--住址\n");
            printf("6--備注\n");
            printf("請輸入你要修改的項:\n");

            do
            {
                rev = ;
                __fpurge(stdin);
                if(scanf("%d",&temp) != )
                {
                    printf("輸入錯誤!請重新輸入!\n");
                    rev = -;
                }
                else if( temp >=  || temp <=  )
                {
                    printf("輸入錯誤!請重新輸入!\n");
                    rev = -;                                   //當選擇的值沒有傳入或者不為1-6時。輸出輸入錯誤請重輸
                }
            }while( rev == - );

            switch(temp)                                        //用switch語句選擇要修改的資訊
            {
                case :{
                           printf("請輸入你要改成的姓名:");
                           scanf("%s",p->name);
                           printf("修改成功!\n");
                           printf("\n");
                           break;
                       }

                case :{
                           printf("請輸入你要改成的性别:");
                           scanf("%s",p->ismale);
                           printf("修改成功!\n");
                           printf("\n");
                           break;
                       }

                case :{
                           printf("請輸入你要改成的電話:");
                           scanf("%s",p->tel);
                           printf("修改成功!\n");
                           printf("\n");
                           break;
                       }

                case :{
                           printf("請輸入你要改成的qq号:");
                           scanf("%s",p->qq);
                           printf("修改成功!\n");
                           printf("\n");
                           break;
                       }

                case :{
                           printf("請輸入你要改成的住址:");
                           scanf("%s",p->address);
                           printf("修改成功!\n");
                           printf("\n");
                           break;
                       }

                case :{
                           printf("請輸入你要改成的備注:");
                           scanf("%s",p->remark);
                           printf("修改成功!\n");
                           printf("\n");
                           break;
                       }

                default:printf("輸入錯誤!\n");
                        break;
            }
        }
    }
}
           

main函數

#include "struct.h"

int main()
{
    struct node *header = (struct node *)malloc(sizeof(struct node));   //定義頭指針
    if( header == NULL )
    {
        printf("malloc error!\n");
        return -;
    }

    for( ; ; )
    {
        int temp = ;
        clear();
        interface();                                                    //調用interface函數,輸出主界面
        __fpurge(stdin);
        scanf("%d",&temp);

        switch(temp)                                                    //switch語句選擇功能
        {
            case :{
                       insert_tail( header );
                       break;
                   }

            case :{
                       list( header );
                       printf("按enter傳回主界面!\n");
                       __fpurge(stdin);         
                       getchar();                                       //暫停界面,有輸入才退出本次選擇語句
                       break;
                   }

            case :{
                       mydelete( header );
                       break;
                   }

            case :{
                       seek( header );
                       printf("按enter傳回主界面!\n");
                       __fpurge(stdin);
                       getchar();
                       break;
                   }

            case :{
                       revise( header );
                       break;
                   }

            case :exit();

            default:{
                        printf("輸入錯誤!");
                        printf("按enter傳回主界面!\n");
                        __fpurge(stdin);
                        getchar();
                        break;
                    }
        }
    }

    return ;
}
           

繼續閱讀