顺序表
来源:互联网 发布:陕西知含监理公司 编辑:程序博客网 时间:2024/06/10 09:22
#include <stdio.h>#include <string.h>#define MAXLEN 100 //定义顺序表的最大长度typedef struct{ char key[10]; //节点的关键字 char name[20]; int age;}DATA; //定义节点类型typedef struct //定义顺序表结构{ DATA ListData[MAXLEN+1];//保存顺序表的结构数组 int ListLen;//顺序表已存节点的数量}SLType;void SLInit(SLType *SL)//初始化顺序表{ SL->ListLen=0;//初始化为空表}int SLLength(SLType *SL){ return (SL->ListLen);//返回顺序表的元素数量}int SLInsert(SLType *SL,int n,DATA data){ int i; if(SL->ListLen>=MAXLEN)//顺序表节点数量已超过最大数量 { printf("顺序表已满,不能插入节点!\n"); return 0; } if(n<1||n>SL->ListLen-1)//插入节点序号不正确 { printf("插入元素序号错误,不能插入元素!\n"); return 0; } for(i=SL->ListLen;i>=n;i--)//将顺序表中的数据向后移动 { SL->ListData[i+1]=SL->ListData[i]; } SL->ListData[n]=data;//插入节点 SL->ListLen++;//顺序表节点数量增加1 return 1;//成功插入返回1}int SLAdd(SLType *SL,DATA data)//增加元素到顺序表尾部{ if(SL->ListLen>=MAXLEN)//顺序表已满 { printf("顺序表已满,不能再添加节点了!\n"); return 0; } SL->ListData[++SL->ListLen]=data; return 1;}int SLDelete(SLType *SL,int n)//删除顺序表中的数据元素{ int i; if(n<1||n>SL->ListLen+1) { printf("删除节点序号错误,不能删除节点!\n"); return 0; } for(i=n;i<SL->ListLen;i++) { SL->ListData[i]=SL->ListData[i+1]; } SL->ListLen--;//顺序表元素数量减1 return 1;}DATA *SLFindByNum(SLType *SL,int n)//根据序号,返回数据元素{ if(n<1||n>SL->ListLen+1) { printf("节点序号错误,不能返回节点!\n"); return NULL; } return &(SL->ListData[n]);}int SLFindByCont(SLType *SL,char *key)//按关键字查询节点{ int i; for(i=1;i<=SL->ListLen;i++) { if(strcmp(SL->ListData[i].key,key)==0) { return i;//返回节点序号 } } return 0;}int SLAll(SLType *SL)//显示顺序表中的所有节点{ int i; for(i=1;i<=SL->ListLen;i++) { printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age); } return 0;}int main(){ int i; SLType SL;//定义顺序表变量 DATA data;//定义节点保存数据类型变量 DATA *pdata;//定义节点保存指针变量 char key[10];//保存关键字 printf("顺序表操作演示!\n"); SLInit(&SL);//初始化顺序表 printf("初始化顺序表完成!\n"); do //循环添加节点数据 { printf("输入添加的节点(学号 姓名 年龄):"); fflush(stdin);//清空输入缓冲区 scanf("%s%s%d",&data.key,&data.name,&data.age); if(data.age)//若年龄不为0 { if(!SLAdd(&SL,data))//若添加节点失败 { break; } } else//若年龄为0 { break; } }while(1); printf("\n顺序表中的节点数序为:\n"); SLAll(&SL);//显示所有节点数据 fflush(stdin); printf("\n输入要取出节点的序号:"); scanf("%d",&i);//输入节点序号 pdata=SLFindByNum(&SL,i);//按序号查找节点 if(pdata)//若返回的节点指针不为NULL { printf("第%d个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age); } fflush(stdin); printf("\n要查找的节点的关键字:"); scanf("%s",key); i=SLFindByCont(&SL,key);//按关键字查找,返回节点序号 pdata=SLFindByNum(&SL,i);//按序号查询,返回节点指针 if(pdata)//若节点指针不为NULL { printf("第%d个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age); } getch(); return 0;}