c语言描述数据结构实例一

1 线性结构的操作

1.1实验数据

学生的学号、姓名、性别、年龄

1.2程序要求

1、用线性表的顺序存储(数组)保存数据

(1)键盘输入你所在宿舍的同学信息到数组;

(2)遍历输出所有学生数据;

(3)按姓名查找并输出指定学生数据,统计查找的次数;

(4)把数组内容输出到文件;

(5)从文件读入学生数据,按学号排序后显示在屏幕;

(6)某同学调入你的宿舍,请增加其信息;并查看增加后的结果;

(7) 某同学调离你的宿舍,请删除其信息;并查看删除后的结果;

2、用线性表的链式存储(链表)保存数据,重新实现第1题的功能。

1.4 程序清单及详解

//顺序表

#include

#include

#include

#define maxsize 100

typedef  struct

{

         int num;

         char name[10];

         char gender[3];

         int age;

}studen;

typedef  struct

{

         studen elen[maxsize];

         int last;

}seqlist;

seqlist  s;

int k=1;//统计查找次数

static int len;//静态全局变量,存放输入的宿舍人数

void init()

{

         int i;

          printf("请输入学生宿舍人数:");

            scanf("%d",&len);

            s.last=len-1;

              for(i=0;i<=s.last;i++)

                    {

                              printf("请输入第%d个学生学号:",i+1);

                               scanf("%d",&s.elen[i].num);

                                 printf("请输入第%d个学生姓名:",i+1);

                                        scanf("%s",s.elen[i].name);

                                          printf("请输入第%d个学生性别:",i+1);

                                                scanf("%s",s.elen[i].gender);

                                printf("请输入第%d个学生年龄:",i+1);

                                     scanf("%d",&s.elen[i].age);

                                     printf("\n");     

                    }     

                     printf("输入学生信息完成!");   

}

void stuprint()//显示函数

{

         int i;

          printf("学生信息\n");

          printf("学号\t姓名\t性别\t年龄\n");

           for(i=0;i<=s.last;i++)

           {

         printf("%d\t%s\t%s\t%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age);

           }

           printf("\n");

}

void locate()//按照姓名查找

{

         int i=0;

         char xm[10];

         printf("请输入要查找的学生姓名:");

          scanf("%s",xm);

          while((i<=s.last)&&(strcmp(s.elen[i].name,xm))!=0)

          {

                    i++;

                    k++;

          }

                   printf("查找的次数为:%d",k);

                   printf("\n");

          if(i<=s.last)

          {

                   printf("学号:%d\t姓名:%s\t性别:%s\t年龄:%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,

         s.elen[i].age);

          }

         else

                   printf("未找到该学生!\n");

}

void insertlist(seqlist *s)//插入

{

         int i;

         int k;

         printf("请输入要插入的位置");

         scanf("%d",&i);

         if((i<1)||(i>s->last+2))

         {

                   printf("插入的位置不合法!");

         }

         if(s->last>=maxsize-1)

                   printf("表已满,无法插入!");

         else

         {

         for(k=s->last;k>=i-1;k--)

                   s->elen[k+1]=s->elen[k];

           printf("请输入要添加的学生信息!\n");

           printf("请输入学生的学号:");

                   scanf("%d", &s->elen[i - 1].num);

                   printf("请输入学生的姓名:");

                   scanf("%s", s->elen[i - 1].name);

                   printf("请输入学生的性别:");

                   scanf("%s", s->elen[i - 1].gender);

                   printf("请输入学生的年龄:");

                   scanf("%d", &s->elen[i - 1].age);

      s->last=s->last+1;

         }

}

void delelist(seqlist *s)

/*按姓名删除*/

{

         int i = 0, k;

         char xm[10];//存放输入要删除的数据

         printf("请输入要删除的姓名:");

         scanf("%s", xm);

         while ((i <= s->last) && (strcmp(s->elen[i].name, xm)) != 0)

                   i++;

         if (i <= s->last)

         {

                   printf("删除学生信息为:学号:%d  姓名:%s 性别:%s 年龄:%d ", s->elen[i].num, s->elen[i].name, s->elen[i].gender,s->elen[i].age);

                   for (k = i; k <= s->last; k++)

                            s->elen[k-1] = s->elen[k];  

                   s->last--;

         }

         else

                   printf("没有该学生!\n");

}

//写文件操作

void savetofile()

{

   FILE *fp;

    if((fp=fopen("d:\\st1.txt","wb+"))==NULL)

                 

    {

                   printf("不能打开文件");

           return;

         }

  for(int i=0;i<=s.last;i++)

{ fprintf(fp,"%d %s %s %d\r\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age);  //写入数据到文件中

  }

 printf("\n写入成功!\n");

}

//读文件操作

void readfile()

{

         FILE * fp; //指针变量

         int i;

         if((fp=fopen("d:\\st1.txt","rb"))==NULL) //rb方式 打开 是用2进制方法打开,只读文件

         {

                   printf("Cannot open file\n"); 

                   return;

         }

                   for(i=0;i<=s.last;i++)        

                   {       

         fscanf(fp,"%d %s %s %d\r\n",&s.elen[i].num,s.elen[i].name,s.elen[i].gender,&s.elen[i].age); //从文件中读取数据

             printf("读取的文件中学号为:%d  姓名:%s  性别:%s  年龄:%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age);

//输出读取的数据

                   }

    fclose(fp);//文件关闭

}

void menu()  //目录

{

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

         printf("\t\t\t学生信息管理系统\n");

         printf("\t\t\t1\t输入学生信息\n");

         printf("\t\t\t2\t输出学生信息\n");

         printf("\t\t\t3\t查找学生信息\n");

         printf("\t\t\t4\t添加学生信息\n");

         printf("\t\t\t5\t删除学生信息\n");

         printf("\t\t\t6\t写入文件\n");

         printf("\t\t\t7\t读取文件\n");

         printf("\t\t\t0\t退出\n");

         printf("\t\t\n");

         printf("\t\t\t请选择(0—7):");

}

int main()

{

         int n;

         menu();

         while(1)

         { 

       scanf("%d",&n);

                   switch(n)

                   {  

                 case 1:init();break;

                            case 2:stuprint();break;

                            case 3:locate();break;

                            case 4:insertlist(&s);break;

                            case 5:delelist(&s);break;

                            case 6:savetofile();break;

                            case 7:readfile();break;

                            case 0:exit(0);break;

                            default:printf("\t\t\t请选择(0—7):");break;

                   }

                   menu();

         }

         return 0;

}

//单链表

#include

#include

#include"string.h"

typedef  struct

{

         int num;

         char name[10];

         char sex[10];

         int age;

}stu;

typedef struct Node

{

         stu data;

         struct Node *next;

}Node,*linklist;

static int count;

int k=1;//存放比较的次数

void insert(linklist head)

{

         linklist q,p;

         q=head;

         printf("请输入学生人数!\n");

         scanf("%d",&count);

         for(int i=0;i

         {

                   printf("\n输入第%d个学生信息:\n",i+1);

                   p=(linklist)malloc(sizeof(Node));

                   printf("输入学号:");

                   scanf("%d",&p->data.num);

                   printf("输入姓名:");

                   scanf("%s",p->data.name);

                   printf("输入性别:");

                   scanf("%s",p->data.sex);

                   printf("输入年龄:");

                   scanf("%d",&p->data.age);

                   printf("输入第%d个学生信息完成!",i+1);

                   if(i==0)

                   {

                            head->next=p; //i=0 链表中没有元素,只有头节点,把p插入到head之后作为第一个结点

                   }

                   else

                   {

                            q->next=p; 

                   }

                   q=p;

         }

         p->next=NULL;//设置next域为空

}

void print(linklist head)

{

         linklist x;

         x=head->next;

         printf("学生信息如下:\n");

         while(x)

         {

                   printf("学号:%d\t 姓名:%s\t 性别:%s\t 年龄:%d\n",x->data.num,x->data.name,x->data.sex,x->data.age);

                   x=x->next;

         }

         printf("\n");

}

void locate(linklist l)

{

         Node *p; 

         int flag = 0;//标志变量

         p = l->next;    /*从表中第一个结点开始 */

         char xm[10];//字符数组用来存放输入的姓名

         printf("请输入要查找的姓名:");

         scanf("%s", xm);

         while (p != NULL)

         {

                   if (strcmp(p->data.name, xm) != 0)//比较是否相同,为零则相同,成功查找到

                   {

                            p = p->next;

                            k++; //当要查找的姓名为第一个的时候,它初始值为1,已经查找过一次

                   }

                   else

                   {

                            printf("已找到:学号:%d  姓名:%s 性别:%s  年龄%d", p->data.num, p->data.name, p->data.sex, p->data.age);

                            flag = 1;

                            printf("\n");

                                     printf("查找的次数为:%d",k);

                                               break;

                   }

         }

         if (flag == 0)

                   printf("未找到此人");

}

void  insertlist(linklist l)

{

         int k=0;

         Node *pre,*s;//一个用来存放新节点,一个用来存放查找插入位置的结点

         int xh,nl;

         char xm[10]; char xb[10];//用来存放要插入的姓名和学号

         int i;

         pre=l;//从头结点开始寻找

         printf("输入要插入的位置:");

         scanf("%d",&i);

                   while(pre!=NULL&&k

 

                   {

                            pre=pre->next;

                            k=k+1;

                   }

                            if(!pre) /*如当前位置pre为空表已找完还未数到第i个,说明插入位置不合理,当条件不成立时执行*/

                            {

                                     printf("插入位置不合法!");

                            }

                              else

                              {

                                       s=(Node*)malloc(sizeof(Node));

                                      printf("输入学号:");

                           scanf("%d",&xh);

                           printf("请输入姓名:");

                                     scanf("%s", xm);

                                     printf("输入性别:");

                                     scanf("%s",xb);

                                     printf("输入年龄:");

                                     scanf("%d",&nl);

                                       s->data.num=xh;

                                      strcpy(s->data.name,xm);

                                      strcpy(s->data.sex,xb);

                                      s->data.age=nl;

                                      s->next=pre->next;

                                      pre->next=s;//连接两个结点

                                      printf("\n插入成功!\n"); 

                              }

}

void dellist(linklist l)

{

         Node *pre,*r;

         int k=0;

         char xm[10];

         int flag=0;

         pre=l;

         printf("输入要删除的学生姓名:");

         scanf("%s",xm);

                   while( pre->next!=NULL)

                   {

                            if(strcmp(pre->next->data.name,xm)!=0)

                             {

                                     pre=pre->next;//指向下一个结点

                             }

                             else

                            {

                           flag=1;

                                     break;

                            }

                   }

           if(flag==0)

           {

                     printf("未找到该学生!");

           }

           r=pre->next;//存放要删除的结点地址

           pre->next=pre->next->next;//实现删除功能

           printf("删除成功!\n");

}

void savetofile(linklist head)

{  

    FILE *fp;

         linklist p;

         p=head->next;//指向第一个结点

    if((fp=fopen("d:\\st2.txt","wb+"))==NULL) //  在d盘打开文件st2   以wb+方式打开  如果文件不存在则会建立,如果文件存在会覆盖

                

    {

          printf("不能打开文件");

           return;

         }

 while(p)

  {

    //写入数据到文件中

         fprintf(fp,"%d %s %s %d\r\n",p->data.num,p->data.name,p->data.sex,p->data.age);

           p=p->next;

  }

 printf("\n写入成功\n");

}

void readfile(linklist head)//把文件中的内容做成一个链表

{

    FILE *fp;

linklist p;    //定义一个链表结点

         p=head->next; //该结点指向第一个元素

         if((fp=fopen("d:\\st2.txt","rb"))==NULL)//  在d盘打开文件st2   以rb方式打开 

              

    {

                   printf("不能打开文件");

                   return;

         }

         while(p)  // 如果p存在 读取文件中的数据

{

                   {       

                            fscanf(fp,"%d %s %s %d\r\n",&p->data.num,p->data.name,p->data.sex,p->data.age);         //从文件中读取数据到链表里面

              

                            printf("读取的文件中学号为:%d  姓名:%s  性别:%s  年龄:%d\n",p->data.num,p->data.name,p->data.sex,p->data.age);

                                       p=p->next;//下一个元素

                   }

                   fclose(fp); //文件关闭

         }

}

void menu()

{

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

         printf("\t\t\t学生信息管理系统\n");

         printf("\t\t\t1\t输入学生信息\n");

         printf("\t\t\t2\t输出学生信息\n");

         printf("\t\t\t3\t查找学生信息\n");

         printf("\t\t\t4\t添加学生信息\n");

         printf("\t\t\t5\t删除学生信息\n");

         printf("\t\t\t6\t写入文件\n");

         printf("\t\t\t7\t读取文件\n");

         printf("\t\t\t0\t退出\n");

         printf("\t\t\n");

         printf("\t\t\t请选择(0—7):");

}

int main()

{

         linklist l;

         l=(linklist)malloc(sizeof(Node));

         l->next=NULL;//初始化头结点

         int n;

         menu();

         while (1)

         {

                   scanf("%d", &n); //输入一个整数

                   switch (n)

 

                   {

                   case 0: exit(0);

                   case 1: insert(l); break;

                   case 2: print(l); break;

                   case 3: locate(l); break;

                   case 4: insertlist(l); break;

                   case 5: dellist(l); break;

                   case 6:savetofile(l);break;

                   case 7:readfile(l);break;

                   default: break;

                   }

                   menu();

         }

return 0;

}

你可能感兴趣的:(数据结构)