//上图为本人所画,基本理解,代码已在devc++环境中成功运行,线性表就像排队一样,本人想了很多天才明白,网上代码太多,不利于初学者理解,有问题在下方评论,有时间会回复,共同努力,加油
#include
#include
#include //strcmp函数
#define MAXSIZE 100
typedef struct {
char name[15];
char num[15];
char phone[15];
}Stu;
typedef struct{ //顺序表结构定义
Stu data[MAXSIZE]; //顺序表数据空间数组
int length; //顺序表长度
}SqList;
//初始化
void InitList(SqList *L) {
L->length = 0; //顺序表长初始化为1
printf("初始化完成\n");
}
//录入学生信息
void inputList(SqList *L,int inputNumber){
int j;
if(L->length==0){//如果表长为0,直接从头输入
for(j=0;j
printf("请输入第%d个学生信息\n",j+1);
printf("请输入姓名:");
scanf("%s",L->data[j].name);
printf("请输入学号:");
scanf("%s",L->data[j].num);
printf("请输入手机号:");
scanf("%s",L->data[j].phone);
L->length++;
}
}else{//在有长度的表中添加信息,存储地址需要加上表长,最后把表长加上输入的个数
for(j=0;j
printf("请输入第%d个学生信息\n",j+1);
printf("请输入姓名:");
scanf("%s",L->data[j+L->length].name);
printf("请输入学号:");
scanf("%s",L->data[j+L->length].num);
printf("请输入手机号:");
scanf("%s",L->data[j+L->length].phone);
}
L->length=L->length+inputNumber;
}
printf("恭喜,%d个学生通讯录信息录入成功\n",inputNumber);
}
//插入
int InsertList(SqList *L, int i, Stu e) {
int j;//循环控制变量
if((i<1)||(i>L->length+1)) { //插入位置错误
printf("插入失败,插入位置错误(1到最后一个元素)\n");
return 1;
} else {
if(i==L->length+1) { //在线性表最后一个元素后插入
L->data[L->length] = e;
L->length++;
} else { //在最后一个元素或之前插入,都得后移其他元素
for(j=L->length; j>=i; j--) {
L->data[j]=L->data[j-1];
}
L->data[i-1] = e;
L->length++;
}
}
printf("插入成功\n");
return 0;
}
//删除
int DeleteList(SqList *L, int i) {
int j;//循环控制变量
if((i<1)||(i>L->length)) {
printf("输入删除学生信息位置错误\n");
return 1;
} else {
if(i==L->length) { //删除最后一个元素
L->length--;
printf("恭喜,删除成功\n");
} else {//从前面第一个或其中删除
for(j=i; jlength; j++) {
L->data[j-1]=L->data[j];
}
L->length--;
printf("恭喜,删除成功\n");
}
}
return 0;
}
//查找
int LookUpElem(SqList L,char lookUpName[15]){
int j;
if(L.length==0){
printf("没有信息,无法查找");
}else{
for(j=0;j
if(strcmp(L.data[j].name,lookUpName)==0){
printf("恭喜,在顺序表第%d个元素位置查找到该元素\n",j+1);
printf("姓名:%s ",L.data[j].name);
printf("学号:%s ",L.data[j].num);
printf("手机号:%s\n",L.data[j].phone);
break;
}else{
if(j==L.length-1){
printf("该学生信息不存在\n");
}
}
}
}
return 0;
}
//取值
int GetElem(SqList L,int i){
char reElem[15];
if((i<1)||(i>L.length)){
printf("输入位置错误\n");
return 1;
}else{
printf("第%d个学生是:\n",i);
printf("姓名:%s ",L.data[i-1].name);
printf("学号:%s ",L.data[i-1].num);
printf("手机号:%s\n",L.data[i-1].phone);
}
}
//输出
void ShowList(SqList *L){
int j;//循环控制变量
if(L->length==0){
printf("通讯录内容为空\n");
}else{
printf("通讯录内容为:\n");
for(j=0;jlength;j++){
printf("姓名:%s ",L->data[j].name);
printf("学号:%s ",L->data[j].num);
printf("手机号:%s\n",L->data[j].phone);
}
}
}
//菜单选择函数
void MenuSlect(){
int numberInput; //菜单序号
int insertNumber; //插入元素位置
int deleteNumber; //删除元素位置
Stu inputDate; //插入数据
SqList L; //顺序表
int j; //循环变量
char inputName[15]; //输入查找学生姓名
int getNumber; //查看学生信息位置
int inputInfoNumber;//想录入学生信息的个数
while(1) {
printf("请输入序号:");
scanf("%d",&numberInput);
if((numberInput<1)||(numberInput>8)){
printf("请您输入1-8菜单项");
}else{
switch(numberInput){
case 1: InitList(&L); //初始化
break;
case 2: printf("您想录入多少个学生的通讯录信息?\n");
//录入信息
scanf("%d",&inputInfoNumber);
inputList(&L,inputInfoNumber);
break;
case 3: printf("请输入插入的信息:\n"); //插入
printf("姓名:");
scanf("%s",&inputDate.name);
printf("学号:");
scanf("%s",&inputDate.num);
printf("手机号:");
scanf("%s",&inputDate.phone);
printf("请输入想要插入的位置:");
scanf("%d",&insertNumber);
InsertList(&L, insertNumber,
inputDate);
break;
case 4: printf("请输入要删除学生信息的位置:"); //删除
scanf("%d",&deleteNumber);
DeleteList(&L,deleteNumber);
break;
case 5: printf("请输入要查找的姓名:"); //查找
scanf("%s",&inputName);
LookUpElem(L,inputName);
break;
case 6: printf("请输入要查看第几个学生的信息:");
//取值
scanf("%d",&getNumber);
GetElem(L,getNumber);
break;
case 7: ShowList(&L); //输出通讯录
break;
case 8: exit(0); //程序退出
break;
}
}
}
}
//主函数
int main(){
printf("1.初始化通讯录 2.录入学生信息\n");
printf("3.插入 4.删除\n");
printf("5.查找 6.取学生信息\n");
printf("7.输出通讯录 8.退出程序\n\n");
MenuSlect();
}