顺序链表

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值