#include<stdio.h>
#include<string.h>
#define maxlen 100//定义顺序链表的最大值
typedef struct
{
char key[10];//链点的关键字
char name[20];
int age;
}Date;//定义链点的类型
typedef struct//定义链点的结构
{
Date listdate[maxlen];
int listlen;
}SLtype;
void chulist(SLtype*sl)//初始化链表
{
sl->listlen=0;
}
int changlist(SLtype*sl)//测量链表的长度
{
return (sl->listlen);
}
int insetlist(SLtype*sl,int n,Date date)//在中间插入一个元素
{
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->listdate[i+1]=sl->listdate[i];
}
sl->listdate[n]=date;
sl->listlen++;
return 1;
}
int addlist(SLtype*sl,Date date)//在最后面加入一个元素
{
if(sl->listlen>=maxlen)
{
printf("链表已满,不能插入链点\n");
return 0;
}
else if(date.age<1||date.age>=120)
{
return 0;
}
sl->listdate[++sl->listlen]=date;
return 1;
}
int deletelist(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->listdate[i]=sl->listdate[i+1];
}
sl->listlen--;
return 1;
}
Date*findlist(SLtype*sl,int n)//找到第i个节点
{
if(n<1||n>sl->listlen+1)
{
printf("节点的序号错误,不能返回节点\n");
return NULL;
}
return &(sl->listdate[n]);
}
int findbykeylist(SLtype*sl,char*key)//通过key找到节点
{
int i=0;
for(i=1;i<=sl->listlen;i++)
{
if(strcmp(sl->listdate[i].key,key)==0)
{
return i;//返回节点序号
}
}
return 0;
}
int alllist(SLtype*sl)
{
int i;
for(i=1;i<=sl->listlen;i++)
{
printf("%s %s %d\n",sl->listdate[i].key,sl->listdate[i].name,sl->listdate[i].age);
}
return 0;
}
int main()
{
int i;
SLtype SL;
Date date;
Date*pdate;
char key[10];
printf("顺序表操作演示:\n");
chulist(&SL);
printf("初始化完成\n");
i=1;
do
{
printf("输入学号,姓名:");
fflush(stdin);
scanf("%s %s %d",&date.key,&date.name,&date.age);
if(date.age>0)
{
if(!addlist(&SL,date))
{
break;
}
}
else
{
break;
}
i++;
}while(i<=maxlen);
printf("顺序表中的结点顺序为:\n");
alllist(&SL);
fflush(stdin);
printf("要取出的结点序号为:");
scanf("%d",&i);
pdate=findlist(&SL,i);
if(pdate)
{
printf("第%d个结点是:%s %s %d\n",i,pdate->key,pdate->name,pdate->age);
}
fflush(stdin);
printf("输入要查找的学号:");
scanf("%s",key);
i=findbykeylist(&SL,key);
pdate=findlist(&SL,i);
if(pdate)
{
printf("第%d个结点是:%s %s %d\n",i,pdate->key,pdate->name,pdate->age);
}
fflush(stdin);
printf("输入要插入得数据(学号 姓名 年龄):");
scanf("%s %s %d",&date.key,&date.name,&date.age);
printf("输入的是第几组数据:");
scanf("%d",&i);
insetlist(&SL,i,date);
printf("顺序表中的结点顺序为:\n");
alllist(&SL);
printf("想删除第几个数据:");
scanf("%d",&i);
deletelist(&SL,i);
alllist(&SL);
return 0;
}
#include<string.h>
#define maxlen 100//定义顺序链表的最大值
typedef struct
{
char key[10];//链点的关键字
char name[20];
int age;
}Date;//定义链点的类型
typedef struct//定义链点的结构
{
Date listdate[maxlen];
int listlen;
}SLtype;
void chulist(SLtype*sl)//初始化链表
{
sl->listlen=0;
}
int changlist(SLtype*sl)//测量链表的长度
{
return (sl->listlen);
}
int insetlist(SLtype*sl,int n,Date date)//在中间插入一个元素
{
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->listdate[i+1]=sl->listdate[i];
}
sl->listdate[n]=date;
sl->listlen++;
return 1;
}
int addlist(SLtype*sl,Date date)//在最后面加入一个元素
{
if(sl->listlen>=maxlen)
{
printf("链表已满,不能插入链点\n");
return 0;
}
else if(date.age<1||date.age>=120)
{
return 0;
}
sl->listdate[++sl->listlen]=date;
return 1;
}
int deletelist(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->listdate[i]=sl->listdate[i+1];
}
sl->listlen--;
return 1;
}
Date*findlist(SLtype*sl,int n)//找到第i个节点
{
if(n<1||n>sl->listlen+1)
{
printf("节点的序号错误,不能返回节点\n");
return NULL;
}
return &(sl->listdate[n]);
}
int findbykeylist(SLtype*sl,char*key)//通过key找到节点
{
int i=0;
for(i=1;i<=sl->listlen;i++)
{
if(strcmp(sl->listdate[i].key,key)==0)
{
return i;//返回节点序号
}
}
return 0;
}
int alllist(SLtype*sl)
{
int i;
for(i=1;i<=sl->listlen;i++)
{
printf("%s %s %d\n",sl->listdate[i].key,sl->listdate[i].name,sl->listdate[i].age);
}
return 0;
}
int main()
{
int i;
SLtype SL;
Date date;
Date*pdate;
char key[10];
printf("顺序表操作演示:\n");
chulist(&SL);
printf("初始化完成\n");
i=1;
do
{
printf("输入学号,姓名:");
fflush(stdin);
scanf("%s %s %d",&date.key,&date.name,&date.age);
if(date.age>0)
{
if(!addlist(&SL,date))
{
break;
}
}
else
{
break;
}
i++;
}while(i<=maxlen);
printf("顺序表中的结点顺序为:\n");
alllist(&SL);
fflush(stdin);
printf("要取出的结点序号为:");
scanf("%d",&i);
pdate=findlist(&SL,i);
if(pdate)
{
printf("第%d个结点是:%s %s %d\n",i,pdate->key,pdate->name,pdate->age);
}
fflush(stdin);
printf("输入要查找的学号:");
scanf("%s",key);
i=findbykeylist(&SL,key);
pdate=findlist(&SL,i);
if(pdate)
{
printf("第%d个结点是:%s %s %d\n",i,pdate->key,pdate->name,pdate->age);
}
fflush(stdin);
printf("输入要插入得数据(学号 姓名 年龄):");
scanf("%s %s %d",&date.key,&date.name,&date.age);
printf("输入的是第几组数据:");
scanf("%d",&i);
insetlist(&SL,i,date);
printf("顺序表中的结点顺序为:\n");
alllist(&SL);
printf("想删除第几个数据:");
scanf("%d",&i);
deletelist(&SL,i);
alllist(&SL);
return 0;
}