用链表实现通讯录并存入文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 100

typedef struct student STU;
int len = 0;

struct student
{
    char name[10];
    int num;
    int age;

    struct student *next;
};

void welcome()
{
    system("clear");
    printf("\n\n\n\n\t\t\t========================================");
    printf("\n\n\t\t\t\t\tWelcome!\n");
    sleep(1);
}

void menu()
{
    system("clear");
    printf("\n\n\t************************************************************************");
    printf("\n\t\t\t\t\t请选择:");
    printf("\n\t\t\t\t\t1.添加信息");
    printf("\n\t\t\t\t\t2.查看信息");
    printf("\n\t\t\t\t\t3.查找信息");
    printf("\n\t\t\t\t\t4.删除信息");
    printf("\n\t\t\t\t\t5.修改信息");
    printf("\n\t\t\t\t\t6.排序");
    printf("\n\t\t\t\t\t7.退出");
    printf("\n\t************************************************************************");

}

/*添加信息*/
void AddInfo(STU *first)
{
    system("clear");

    printf("姓名 学号 年龄\n");
    printf("------------------------\n");
    printf("请输入信息:\n");

    STU *q = (STU *)malloc(sizeof(STU));
    STU *s;
    q = first;

    char flag = 'y';
    if(NULL == q)
    {
        printf("malloc failure!\n");
    }

    while(q->next != NULL)
    {
        q = q->next;
    }

    while(flag == 'y')
    {
        s = (STU *)malloc(sizeof(STU));
        scanf("%s", s->name);
        scanf("%d%d", &s->num, &s->age);
        s->next = NULL;
        q->next = s;
        q = s;
        len++;
        getchar();
        printf("继续添加?(y/n)");
        scanf("%c", &flag);
    }
}


void ShowAll(STU *first)
{
    system("clear");
    STU *p;
    p = first->next;

    printf("information:\n");
    /*
       for(i = 0; i < person; i++)
       {
       for(j = 0; j < person - 1 - i; j++)
       {
       if(strcmp(s[j]->name, s[j + 1]->name) > 0)
       {
       q[0] = s[j];
       s[j] = s[j + 1];
       s[j + 1] = q[0];
       }
       }
       }
       */
    while(p->next)
    {
        printf("\e[1;35mname:%s, num:%d, age:%d\e[0m\n", p->name, p->num, p->age);
        p = p->next;
    }
    printf("\e[1;35mname:%s, num:%d, age:%d\e[0m\n", p->name, p->num, p->age);
    sleep(3);
    getchar();
}

void Sort(STU *first)
{
    int i, j;
    STU *p;
    p = first->next;
    if(p == NULL)
    {
        printf("没有元素!\n");
    }
    for(i = 0; i < len; i++)
    {
        for(j = 0; j < len - 1 - i; j++)
        {
            if(strcmp(p->name, p->next->name) > 0)
            {
                STU *s = p;
                p = p->next;
                p->next = s;
            }
        }
    }
    while(p->next)
    {
        printf("\e[1;35mname:%s, num:%d, age:%d\e[0m\n", p->name, p->num, p->age);
        p = p->next;
    }
    printf("\e[1;35mname:%s, num:%d, age:%d\e[0m\n", p->name, p->num, p->age);
    sleep(3);
}

/*查找信息*/
void SearchInfo(STU *first)
{
    system("clear");
    //char *name = (char *)malloc(sizeof(char));

    char name[10];
    int i, n = 0;

    printf("请输入要查找的人的名字:\n");
    //fflush(stdin);
    scanf("%s", name);

    STU *p = NULL;
    p = first->next;

    for(i = 0; i < len; i++)
    {
        if(strcmp(name, p->name) == 0)
        {
            n = 1;
            printf("该学生的信息如下:\n");
            printf("name:%s, num:%d, age:%d\n", p->name, p->num, p->age);
            sleep(3);
            break;
        }
        p = p->next;
    }

    if(n == 0)
    {
        printf("不存在!\n");
    }
    else
    {
        printf("查找成功!\n");
    }
    getchar();
    sleep(3);

}

/*删除信息*/
void DeleteInfo(STU *first)
{
    system("clear");
    int i, n = 0;
    char del_name[10];
    STU *p;
    p = first->next;

    printf("请输入要删除的人的名字:\n");
    scanf("%s", del_name);
    getchar();

    for(i = 0; i < len; i++)
    {
        if(strcmp(del_name, p->name) == 0)
        {
            break;
        }
        n++;
        p = p->next;
    }

    p = first->next;
    for(i = 0; i < n - 1; i++)
    {
        p = p->next;
    }

    STU *s = p->next;
    p->next = s->next;
    free(s);
    len--;

    if(n == 0)
    {
        printf("要删除的人不存在!\n");
    }
    else
    {
        printf("删除成功!\n");
    }
}

/*修改信息*/
void ChangeInfo(STU *first)
{
    system("clear");
    char *name = (char *)malloc(sizeof(char));
    char *new_name = (char *)malloc(sizeof(char));
    int new_num, new_age;
    int i, choice;

    printf("请输入要修改的人的名字:\n");
    scanf("%s", name);

    STU *p;
    p = first->next;

    for(i = 0; i < len; i++)
    {
        if(strcmp(name, p->name) == 0)
        {
            printf("该学生的信息如下:");
            printf("name:%s, num:%d, age:%d\n", p->name, p->num, p->age);
            printf("----------------------------\n");
            printf("请选择要修改的内容(1.name 2.num 3.age):\n");
            scanf("%d", &choice);
            switch(choice)
            {
                case 1:
                    printf("请输入新的名字:\n");
                    scanf("%s", new_name);
                    strcpy(p->name, new_name);
                    break;
                case 2:
                    printf("请输入新的学号:\n");
                    scanf("%d", &new_num);
                    p->num = new_num;
                    break;
                case 3:
                    printf("请输入新的年龄:\n");
                    scanf("%d", &new_age);
                    p->age = new_age;
                    break;
            }
        }
        p = p->next;
    }

    printf("不存在!\n");

}

void writedata(STU *first)
{
    FILE *fp = fopen("Student.txt", "w+");
    if (fp == NULL)
    {
        perror ("fopen");
        return;
    }

    fwrite(&len, sizeof(int), 1, fp);// 要写入个数
    STU *p = first;
    while(p->next != NULL)
    {
        p = p->next;
        int length = sizeof(STU);//写入数据的长度
        fwrite(&length, sizeof(int), 1, fp);
        fwrite(p, length, 1, fp);//写入数据
    }

    fclose(fp);
}

void readdata(STU *first)
{
    FILE *fp = fopen("Student.txt", "ab+");

    if (fp == NULL)
    {
        perror ("fopen");
        return;
    }

    STU *temp = first;

    fread (&len, sizeof(int), 1, fp);   // 读记录的个数
    int i;
    for (i = 0; i < len; i++)
    {
        int length;
        fread (&length, sizeof(int), 1, fp);

        STU *p = (STU *)malloc(sizeof(STU));
        if( p == NULL )
        {
            printf("malloc error!\n");
            return ;
        }

        int ret = fread (p, length, 1, fp);        // 读取数据
        printf("%d\n",ret);

        while( temp->next != NULL )
        {
            temp = temp->next;
        }
        temp->next = p;    //找到最后一个结点,将结点p尾插进链表
        p->next = NULL;
    }

    fclose(fp);

}

int main()
{
    STU *first = (STU *)malloc(sizeof(STU) * 10);
    first->next = NULL;
    int choice;
    welcome();
    readdata(first);

    while(1)
    {
        menu();
        printf("\nPlease input choice:");
        scanf("%d", &choice);

        switch(choice)
        {
            case 1:
                AddInfo(first);
                writedata(first);
                break;
            case 2:
                ShowAll(first);
                break;
            case 3:
                SearchInfo(first);
                break;
            case 4:
                DeleteInfo(first);
                break;
            case 5:
                ChangeInfo(first);
                break;
            case 6:
                Sort(first);
                break;
            case 7:
                writedata(first);
                exit(0);
                break;
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41998576/article/details/81672751