用单链表实现学生管理系统的增删改查

        老师布置的作业,根据书上的例子以及网上的信息所写出来的用单链表实现的学生管理系统,后续还会有其他的算法会慢慢写到博客上供大家参考,这都是C语言必须掌握的算法,希望能给你们带来帮助。

定义结构体及链表

定义一个学生成绩信息的结构体及带头结点的空链表,将Student的信息写到链表的数据域中。

 

struct  Node;

typedef struct Node *PNode;

typedef struct Student

{

       int number;

       char name[20];

       int result;

}Stu;

 

typedef struct Node//定义单链表结点结构体

{

       Stu info;

       PNode link;

}*LinkList;  //带头结点的单链表

创建空链表

创建带头结点的空链表,主要是为单链表的有节点申请空间,如果申请成功,则返回单链表,如果不成功,则创建失败。

 

LinkList createNullList_link(void)

{

       LinkList llist = (LinkList)malloc(sizeof(struct Node));

     //给头结点申请空间

       if (llist != NULL)

              llist->link = NULL;

       else

              printf("Out of space!\n");

       return llist;//申请成功返回单链表

}

链表的插入

   在带头节点的单链表llist,在p所指节点后面插入x的新节点,返回插入成功标志,插入失败则输出插入失败。执行插入算法时需要将指针p所指的指针域与新申请的节点空间所指的同意指针域,然后将p指针指向x指针域。

 

int insertPost_link(LinkList llist, PNode p, Stu x)

                                                 //p所指结点后面插入信息x

{

       PNode q = (PNode)malloc(sizeof(struct Node));//申请新节点

       if (q == NULL)

       {

              printf("Out of space!!\n");  //内存溢出//

              return 0;

       }

       else

       {

              q->info = x;

              q->link = p->link;

              p->link = q;

              return 1;

       }

}

链表的删除和查找

在带头节点的单链表中删除p所指的节点,返回删除成功的标志。由于在单链表中只有指向后集结点的指针,所以先要调用查找的函数,所输入的学号与链表中的按顺序查找,找到了则将它删除。

 

int deleteV_link(LinkList llist, int x)//删除第一个值为x的结点

{

       PNode p, q;

       p = llist;

       if (p == NULL)

       {

              return 0;

       }

       while (p->link != NULL&&p->link->info.number != x)

       {         //找到第一个值为x的结点,并将其前驱结点存储位置记录在p中

              p = p->link;

       }

       if (p->link == NULL)

       {

              printf("Not exist!\n");

              return 0;

       }

       else

       {

              q = p->link;       //找到值为x的结点,删除该结点

              p->link = q->link;//从链表中删除

              free(q);          //从内从中删除

              return 1;

       }

}

//线性表的排序,采用冒泡排序,直接遍历链表

 

PNode locate_link(LinkList llist, int id)    //在链表中找到值为id的结点存储位置//

{

    PNode p;  //结点指针//

    if (llist == NULL)return NULL;

    p = llist -> link;

     printf("查找学生的成绩为:");

        printf("\n学号\t 姓名\t 成绩\n");

    if (p -> info.name == id)

    {

           printf("%d\t%s\t%0.1f\t%0.1f\t%0.1f\n",p->info.number,p->info.name,p->info.Chinese,p->info.Math,p->info.English);

    }

    else p = p -> link;

    return p;

}

显示所有学生成绩

   要输出所有学生成绩,需要定义一个表list,然后再主函数中创建一个空的list,将list->link赋值给p,如果指针p不为空,则输出该数据域信息,在继续向后指,知道p所指为空时退出。

 

void printData(LinkList list)//在主函数里面创建list

{

       PNode p;

       p = list->link;

    printf("所有的学生的成绩为:");

    printf("\n学号\t 姓名\t 成绩\n");

       while (p != NULL)

       {

              printf("%d\t%s\t%d\n", p->info.number, p->info.name,p->info.chengjih);

              p = p->link;

       }

}

菜单

Void printMenu()

{

           printf("*************************************\n");

        printf("欢迎使用学生成绩管理系统\n");

        printf("[1] 插入学生信息\n");

        printf("[2] 删除学生信息\n");

        printf("[3] 按学号查找学生信息\n");

        printf("[4] 显示学生信息\n");

        printf("[5] 退出系统\n");

        printf("*************************************\n");

        printf("请输入您的选择(1-5):\n");

}

主函数

定义两个变量,在用while(1)死循环,case1,2,3,4,5就是插入,输出,查找,显示等函数,如果成功操作,则返回成功。

 

int main()

{

       int a,id;

       int chioce;

       Stu stu;

       LinkList list = createNullList_link();

       while(1)

        {

              printMenu();

              scanf("%d", &chioce);

              switch (chioce)

              {

              case 1:

             printf("请输入信息:\n");

                printf("学号:\n姓名:\n成绩\n");

                scanf("%d %s %0.1f %0.1f %0.1f", &stu.number, &stu.name, &stu.chengji);

                     if (insertPost_link(list, list, stu) == 1)

{

                        printf("插入成功!");

            }

 break;

              case 2:

                     printf("请输入删除的学生学号:\n");

                     scanf(" %d", &a);

            if (deleteV_link(list, a) == 1)

                       {

printf("删除成功!");

            }

break;

        case 3:

            printf("请输入查找的学生学号:\n");

                     scanf(" %d", &id);

                     if (locate_link(list, id) == 1)

                       {

printf("查询成功!");

                       }

break;

              case 4:

                     printData(list);

                     break;

              default:

                     printf("请重新输入:");

                     break;

              }

       }

       return 0;



你可能感兴趣的:(#,C语言算法)