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

typedef struct student
{
    int id;
    char name[20];
    int age;
    char sex;
    char birthday[20];
    char address[20];
    char phone[15];
    char email[30];
    struct student *next;
}student;

student *head = NULL;
int length;
void create()
{
    student *p1,*p2;
    length = 0;
    p1 = (student *)malloc(sizeof(student));
    p1->id = -1;
    if(head == NULL)
    {
        head = p1;
    }
    printf("请输入学生的学号、姓名、年龄、性别、出生年月、地址、电话、电子邮箱:\n");
    while(1)
    {
        p2 = (student *)malloc(sizeof(student));
        scanf("%d %s %d %c %s %s %s %s",&p2->id,p2->name,&p2->age,&p2->sex,&p2->birthday,&p2->address,p2->phone,p2->email);
        if(p2->id == 0)
        {
            printf("链表创建完成!\n");
            break;
        }
        length ++;
        p1->next = p2;
        p2->next = NULL;
        p1 = p1->next;
    }
    return ;
}

void LoadStudentInFromFile()
{
    student *p,*q;
    int c;
    FILE* f;
    f = fopen("input.txt","rb");
    if(f == NULL)
    {
        return ;
    }
    fseek(f,0,SEEK_SET);
    p = (student *)malloc(sizeof(student));
    p->next = NULL;
    head = p;
    while(!feof(f))
    {
        c = fgetc(f);
        if(c != -1)
        {
            fseek(f,-1,SEEK_CUR);
        }
        else
        {
            return ;
        }
        q = (student *)malloc(sizeof(student));
        fscanf(f,"%d",&q->id);
        fscanf(f,"%s",q->name);
        fscanf(f,"%d",&q->age);
        fscanf(f,"%c",&q->sex);
        fscanf(f,"%s",q->birthday);
        fscanf(f,"%s",q->address);
        fscanf(f,"%s",q->phone);
        fscanf(f,"%s",q->email);
        q->next = NULL;
        p->next = q;
        p = p->next;
        length ++;//链表长度
    }
}

void ModifyStudentInfo()
{
    student *p = head->next;
    int num;
    printf("请输入要修改的学生的学号:");
    scanf("%d",&num);
    while(p != NULL)
    {
        if(p->id == num)
        {
            printf("修改前,学号为%d的学生信息如下:\n",num);
            printf("%d %s %d %c %s %s %s %s",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
            printf("请输入学生的新电话:");
            getchar();
            gets(p->phone);
            printf("请输入学生的新地址:");
            gets(p->address);
            printf("修改后,学号为%d的学生信息如下:\n",num);
            printf("%d %s %d %c %s %s %s %s",&p->id,p->name,&p->age,p->sex,p->birthday,p->address,p->phone,p->email);
            return ;
        }
        p = p->next;
    }
    if(p == NULL)
    {
        printf("该学号不存在!\n");
        return ;
    }
}
void display()
{
    student *p = head->next;
    printf("链表中所有的学生信息如下:\n");
    while(p != NULL)
    {
        printf("%d %s %d %c %s %s %s %s",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
        printf("\n");
        p = p->next;
    }
    return ;
}

void search()
{
    int num,x;
    char name[20];
    student *p = head->next;
    printf("请选择查询方式:\n");
    printf("1、按学号查询\t2、按姓名查询\n");
    scanf("%d",&x);
    if(x == 1)
    {
        printf("需要查找的学生学号为:");
        scanf("%d",num);
        while(p != NULL)
        {
            if(p->id == num)
            {
                printf("学号为%d的学生信息如下:\n",num);
                printf("%d %s %d %c %s %s %s %s",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
                return ;
            }
            p = p->next;
        }
        if(p == NULL)
        {
            printf("无此记录!\n");
        }
    }
    else if(x == 2)
    {
        printf("需要查找的学生姓名为:");
        getchar();
        gets(name);
        p = head->next;
        while(p != NULL)
        {
            if(strcmp(p->name,name) == 0)
            {
                printf("学生姓名为%s的学生信息如下:\n",name);
                printf("%d %s %d %c %s %s %s %s",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
                return ;
            }
            p = p->next;
        }
        if(p == NULL)
        {
            printf("无此记录!\n");
        }
    }
    return ;
}

void insert()
{
    int num,i;
    student *p,*q;
    p = head;

    printf("请输入你要插入的位置:");
    scanf("%d",&num);
    if(num > length)
    {
        printf("找不到插入的位置\n");
        return ;
    }
    else
    {
        printf("请输入你要插入的学生的信息:\n");
        q = (student *)malloc(sizeof(student));
        scanf("%d %s %d %c %s %s %s %s",&q->id,q->name,&q->age,&q->sex,q->birthday,q->address,q->phone,q->email);
        while(p != NULL)
        {
            if(p->id == q->id)
            {
                printf("该学号已经存在,无法插入!\n");
                return ;
            }
            p = p->next;
        }
        p = head;
        for(i=0; i<num; ++i)
        {
            p = p->next;
        }
        q->next = p->next;
        p->next = q;
        length ++;
        printf("插入成功!\n");
        return ;
    }
}

void Delete()
{
    int num;
    student *p,*q;
    q = head;
    p = head->next;
    printf("请输入要删除的学生的学号:\n");
    scanf("%d",&num);

    while(p != NULL)
    {
        if(p->id == num)
        {
            q->next = p->next;
            free(p);
            length --;
            printf("删除成功!\n");
            return ;
        }
        p = p->next;
        q = q->next;
    }
    if(p == NULL)
    {
        printf("找不到要删除的编号!\n");
        return ;
    }
}

void menu()
{
    printf("___________________________________________________\n");
    printf("|        学生信息管理系统          |\n");
    printf("|        0、退出系统              |\n");
    printf("|        1、录入学生信息              |\n");
    printf("|        2、建立链表              |\n");
    printf("|        3、显示链表              |\n");
    printf("|        4、查找链表中的某个元素          |\n");
    printf("|        5、删除链表中指定学号的结点      |\n");
    printf("|        6、指定位置上插入一个新结点      |\n");
    printf("|        7、修改学生信息              |\n");
    printf("__________________________________________________\n");
    return ;
}

int main(void)
{
    int a;
    menu();
    while(1)
    {
        printf("请输入相应的功能:");
        scanf("%d",&a);
        switch(a)
        {
        case 0:
            return 0;
        case 1:
            LoadStudentInFromFile();
            menu();
            break;
        case 2:
            create();
            menu();
            break;
        case 3:
            if(head)
            {
                display();
                menu();
            }
            else
            {
                printf("链表为空,请先建立链表!\n");
                menu();
            }
            break;
        case 4:
            if(head)
            {
                search();
                menu();
            }
            else
            {
                printf("链表为空,请先建立链表!\n");
                menu();
            }
            break;
        case 5:
            if(head)
            {
                Delete();
                menu();
            }
            else
            {
                printf("链表为空,请先建立链表!\n");
                menu();
            }
            break;
        case 6:
            if(head)
            {
                insert();
                menu();
            }
            else
            {
                printf("链表为空,请先建立链表!\n");
                menu();
            }
            break;
        case 7:
            if(head)
            {
                ModifyStudentInfo();
                menu();
            }
            else
            {
                printf("链表为空,请先建立链表!\n");
                menu();
            }
            break;
        default:
            break;
        }
    }
    system("pause");
    return 0;
}

 

posted on 2015-04-24 20:15  Tsl_Dream  阅读(15255)  评论(0编辑  收藏  举报