Manchester


私信TA

用户名:wenyajie

访问量:310665

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 62388
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:

①:观察题目发现用要求用线性表中的顺序表

②:定义一个结构体表示"名单表",表中的每一项都是字符串,故需再定义一个"名字结构体"

包含人名 的结构体作为名单表结构体的成员变量

typedef struct People_{

   char name[20];

}*People,PEOPLE;

typedef struct List_{

  struct People_ *person;

   int length;
   int listsize;

}*List,LIST;

③:声明所需的函数

void insert_(List L,int n,char *name);
int search_(List L,char *name);/*找到后返回其位置,下标*/
void delete_(List L,char *name);
void show_(List L);
int compare_(char *order);
void creat_List(List L);

/*int search_(List L,char *name)该函数返回类型为int,是因为便于后面的删除操作
因为,删除操作里面也要查找,这样定义删除函数void delete_(List L,char *name)的时候
就不用再写一遍查找的代码了*/


④:编写主函数框架

int main()
{

    int n,c;
    char name[20],order[7];
    LIST L;
    creat_List(&L);
    while(scanf("%s",order)!=EOF)
        {
              c=compare_(order);

                 switch(c){

                    case 1:{
                          /*插入名字*/
                          /*输入位置和名字*/
                          scanf("%d",&n);
                          scanf("%s",name);
                          /*判断插入位置是否合法*/
                          /*n=1插入到下标为0,故可插入位置为下标从0到length
                          故n为1到length+1*/
                          if(n>=1&&n<=L.length+1)
                          insert_(&L,n,name);
                          break;
                    }


                    case 2:{
                          /*删除名字*/
                          /*输入名字*/
                          scanf("%s",name);
                          delete_(&L,name);
                          break;
                    }

                    case 3:{
                      /*输出list中所有名字*/
                       show_(&L);
                       break;
                    }

                    case 4:{
                      /*查找位置*/
                      /*输入查找的名字*/
                      scanf("%s",name);
                      int d=search_(&L,name);
                      /*找到的话输出*/
                      if(d!=-1)
                      printf("%d\n",d+1);
                      break;
                    }


                 }

        }
return 0;
}


⑤:定义声明的函数


注意事项:
1)插入时判断位置是否合法
2)插入后表长度加1

3)删除后表长度减去1

4)插入前判断表是否满了,满了的话重分配空间

5)输出的时候人名用空格隔开

6)每个输出占一行

7)表为空的时候,没名字,也要空一行

8)该代码没有考虑输入人名重复的问题


参考代码:

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

#define SIZE 100  /*列表初始长度*/
#define ADD 10 /*列表满了后增加的长度*/
typedef struct People_{

   char name[20];

}*People,PEOPLE;

typedef struct List_{

  struct People_ *person;

   int length;
   int listsize;

}*List,LIST;

void insert_(List L,int n,char *name);
int search_(List L,char *name);/*找到后返回其位置,下标*/
void delete_(List L,char *name);
void show_(List L);
int compare_(char *order);
void creat_List(List L);

int main()
{

    int n,c;
    char name[20],order[7];
    LIST L;
    creat_List(&L);
    while(scanf("%s",order)!=EOF)
        {
              c=compare_(order);

                 switch(c){

                    case 1:{
                          /*插入名字*/
                          /*输入位置和名字*/
                          scanf("%d",&n);
                          scanf("%s",name);
                          /*判断插入位置是否合法*/
                          /*n=1插入到下标为0,故可插入位置为下标从0到length
                          故n为1到length+1*/
                          if(n>=1&&n<=L.length+1)
                          insert_(&L,n,name);
                          break;
                    }


                    case 2:{
                          /*删除名字*/
                          /*输入名字*/
                          scanf("%s",name);
                          delete_(&L,name);
                          break;
                    }


                    case 3:{
                      /*输出list中所有名字*/
                       show_(&L);
                       break;
                    }

                    case 4:{
                      /*查找位置*/
                      /*输入查找的名字*/
                      scanf("%s",name);
                      int d=search_(&L,name);
                      /*找到的话输出*/
                      if(d!=-1)
                      printf("%d\n",d+1);
                      break;
                    }


                 }

        }
return 0;
}
/*==========================================================*/
/*用于返回数字选择功能*/
int compare_(char *order)
{

  if(!strcmp(order,"insert"))
    return 1;
    else
     if(!strcmp(order,"delete"))
     return 2;
       else
        if(!strcmp(order,"show"))
          return 3;
          else
           return 4;

}
/*==========================================================*/
/*建立空名单*/
void creat_List(List L)
{

  L->person=(People)malloc(SIZE*sizeof(PEOPLE));
  L->length=0;
  L->listsize=SIZE;

}
/*==========================================================*/
void insert_(List L,int n,char *name)
{
     /*判断列表是否满了*/
     if(L->length==L->listsize)
       L->person=(People)realloc(L->person,(L->listsize+ADD)*sizeof(PEOPLE));


         /*腾出插入空间*/
          for(int i=L->length-1;i>=n-1;i--)
            L->person[i+1]=L->person[i];

            /*插入名字*/
            strcpy((L->person[n-1].name),name);
            /*列表长度加1*/
            L->length++;

return ;
}
/*==========================================================*/
void delete_(List L,char *name)
{
   /*找出名字的位置*/
   /*这里返回的直接是下标*/
    int n=search_(L,name);
    /*没找到返回*/
    if(n==-1)
     return ;
     /*删除名字*/
      for(int i=n;i<L->length-1;i++)
        strcpy(L->person[i].name,L->person[i+1].name);

         /*删除完毕,长度减去1*/
         L->length--;
      return ;
}
/*==========================================================*/
int search_(List L,char *name)
  {

     int n=-1;/*-1表示没找到*/

     for(int i=0;i<L->length;i++)
       {
          if(!strcmp(L->person[i].name,name))
            {n=i;break;}
       }
  return n;
  }

/*==========================================================*/
void show_(List L)
{ /*如果表空,输出换行*/
  if(L->length==0)
    printf("\n");
    else
     for(int i=0;i<L->length-1;i++)
      printf("%s ",L->person[i].name);
      puts(L->person[L->length-1].name);
return ;
}

别忘点赞哦-.-!


 

0.0分

7 人评分

  评论区