(参考的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");
}
}
}