顺序表制作图书目录(C++、C语言混用)

 (参考的c++版的数据结构,大体用的还是c,因为是复习用的,保存下来方便之后看到。如有代码或表述错误感谢指出)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define MAX 10//最大长度 
typedef struct{
 char num[MAX];
 char name[MAX];
// int score;
}choice;//如果是指向具体的变量不要用指针,直接定义;此外,int定义类型的话之后scanf要用&,因为没有指针指向;指针引用用箭头,变量用点
typedef struct{
 choice *cho;
 int length;//定义表长 
 int maxsize; 
}SqList; 

int InitList(SqList &L){
// choice *p=0;    
 L.cho=new choice[MAX];
 if(!L.cho)return 0;
// p=L.cho; 
 L.length=0;//用于清空数据表,使得避免存在脏数据。
 L.maxsize=MAX;
 return 0;
}//动态分配
void IncreaseSize(SqList &L)//增加顺序表的长度
{
    int len;
    choice *p =L.cho;
    printf("请输入你要增加的顺序表的长度:");
    scanf("%d", &len);
    L.cho = (choice *)malloc((L.maxsize+len)*sizeof(choice));
    for (int i = 0; i < L.length; i++)
        L.cho[i] = p[i];
    L.maxsize = L.maxsize + len;
    free(p);
}
void Write(SqList &L){
 int n,i;
 choice *p =L.cho;

 if(L.length>0){
     printf("表中已有数据,不能新建!\n");
     return ;
 }
 printf("录入新增数据个数:");
 scanf("%d",&L.length);
 for(i=0;i<L.length;i++){
  printf("编号: 姓名: ");
  scanf("%s %s",p->num,p->name);
  p++;
 }
}//录入 
bool Insert(SqList &L,int i,choice &e){
    if(i<1||i>L.length+1){printf("指定位置不存在!");return false;} 
    if(L.length==L.maxsize){IncreaseSize(L);}
   
    i--; 
    choice *p=L.cho;
    
    for(int pos=L.length;pos>i;pos--){
        p[pos]=p[pos-1];
    }
    p+=i;
    *(p)=e;//!!!!!!!!!!!!!!
    //strcpy(p->num,e.num);
    //strcpy(p->name,e.name);
    L.length++;    
    return true;
}//增  
bool Delet(SqList &L){
    int i,j,elem;//i is the choice and j is the location;
    int flag=0;
    char tmpname[MAX];
    choice *p,k;
    p=L.cho;
    printf("请选择删除方式:1、按存放位置删除;2、按元素删除\n");
    scanf("%d",&i);
    switch(i){
        case 1:  
        printf("请输入你想要删除的位置:");
        scanf("%d",&j);
        if(!j||j>L.length) return false;
        if(!L.cho) return false;
        for(int m=j;m<L.length;m++)
        {
            L.cho[m-1]=L.cho[m];
            }
        L.length--;
        printf("删除成功\n");
        break;
        case 2:
        printf("请输入你想要删除元素:");
        scanf("%s",tmpname);
        for(int elem=0;elem<L.length;elem++,p++)//
        {    
            if(strcmp(p->name,tmpname)==0)
            {
              flag=1;
               for(int m=elem;m<L.length;m++){L.cho[elem]=L.cho[elem+1];}
              L.length--;
              printf("删除成功\n");
              break;
            }    
        }
        if(!flag) {printf("未找到元素\n");}
        break;
        default:break;
    }
}//删 
int Locate(SqList &L){
    int i,loc;
    int j=0;
    int flag=0;
    char elem[8];
    choice *p=L.cho;    
    printf("请输入查询方式:1、按位置查找  2、按元素查找");
    scanf("%d",&i);
    if(i==1)
    {
        printf("请输入位置");
        scanf("%d",&loc);
        printf("%s",p[loc-1].name);
    }
    else if(i==2)//
    {
        printf("请输入元素:");
        scanf("%s",elem); 
        for(j=0;j<L.length;j++)
            {
                if(strcmp((p+j)->name,elem)==0)            
                    {
                        printf("%s %s\n",p[j].num,p[j].name);     
                    }
            }
    }
    else printf("所查项目不存在");return 0;
}//查 
int Change(SqList &L){
    int i;
    choice e;
    choice *p=L.cho;
    printf("weizhihexiangmu");
    scanf("%d %s",&i,e.name);    
    printf("%s",e.name);
    strcpy(L.cho[i-1].name,e.name);

}
int Length(SqList &L)//求表长
{
    if (L.length == 0)
        return 0;
    return L.length;
}
void Print(SqList &L)
{
    choice *p=L.cho; 
    for(int i=0;i<L.length;i++){
        printf("%s %s\n",p->num,p->name);
        p++;
    }
    //printf("\n");
    int num;
    num=Length(L);
    printf("此时表长=%d\n",num);
}
int menu(){
    printf("  \t\t\t--------------------\n");
    printf("  \t\t\t-----建立选择表-----\n");    
    printf("  \t\t\t----1、新建项目-----\n");
    printf("  \t\t\t----2、增加条目-----\n");
    printf("  \t\t\t----3、删除条目-----\n");
    printf("  \t\t\t----4、查找条目-----\n");
    printf("  \t\t\t----5、展示条目-----\n");
    printf("  \t\t\t----6、修改条目-----\n");
    printf("  \t\t\t----7、退出项目-----\n");
    printf("  \t\t\t--------------------\n");
}
 int main(){
      SqList L;
      int i;
    int choose;
    int m=0;
    char password[6];

      choice e;
      InitList(L);

  wh ile(1){  
        menu();
        printf("请输入你的选择:");
        scanf("%d",&choose);
        switch(choose) {
            case 1:printf("请输入表单的类型:1、有初始值 2、空白表单:");
                   scanf("%d",&m);
                   if(m==1){
                        choice s[4]={"1","la","2","pu","3","lan","4","de"};
                        for(i=0;i<4;i++){
                            Insert(L,i+1,s[i]);}
                        Print(L); 
                   }
                   else if(m==2){
                        Write(L); 
                   }
                   break;
            case 2:printf("请输入插入位置");scanf("%d",&i);
                   printf("请输入相关元素");scanf("%s %s",e.num,e.name);
                   printf("%d %s %s",i,e.num,e.name);
                   Insert(L,i,e);
                   break;
            case 3:Delet(L);break;
            case 4:printf("请输入查询项目");
                   Locate(L);break;
            case 5:Print(L);break;
            case 6:printf("请输入密码:");scanf("%s",password);
                   if(strcmp(password,"112358")==0) {Change(L);}
                   else {printf("你没有修改权限。");}
                   break;
            case 7:printf("程序已退出");exit(0);
            default:printf("error");
        }
    }
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值