一个应用单链表基本算法的程序

 

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define N 10

typedef struct node
{
  char name[20];
  struct node *link;
}stud;

stud * creat(int n)
{
  stud *p,*h,*s;
  int i;
  if((h=(stud *)malloc(sizeof(stud)))==NULL)
  {
    printf("不能分配内存空间!");
    exit(0);
  }
  h->name[0]='/0';
  h->link=NULL;
  p=h;
  for(i=0;i<n;i++)
  {
    if((s= (stud *) malloc(sizeof(stud)))==NULL)
    {
      printf("不能分配内存空间!");
      exit(0);
    }
    p->link=s;
    printf("请输入第%d个人的姓名",i+1);
    scanf("%s",s->name);
    s->link=NULL;
    p=s;
  }
  return(h);
}

stud * search(stud *h,char *x)
{
  stud *p;
  char *y;
  p=h->link;
  while(p!=NULL)
  {
    y=p->name;
    if(strcmp(y,x)==0)
      return(p);
    else p=p->link;
  }
  if(p==NULL)   printf("没有查找到该数据!");
}

stud * search2(stud *h,char *x)
{
  stud *p,*s;
  char *y;
  p=h->link;
  s=h;
  while(p!=NULL)
  {
    y=p->name;
    if(strcmp(y,x)==0)
      return(s);
    else
    {
      p=p->link;
      s=s->link;
    }
  }
  if(p==NULL)  printf("没有查找到该数据!");
}

void insert(stud *p)
{
  char stuname[20];
  stud *s;
  if((s= (stud *) malloc(sizeof(stud)))==NULL)
  {
    printf("不能分配内存空间!");
    exit(0);
  }
  printf("/n请输入你要插入的人的姓名:");
  scanf("%s",stuname);
  strcpy(s->name,stuname);
  s->link=p->link;
  p->link=s;
}

void del(stud *x,stud *y)
{
  stud *s;
  s=y;
  x->link=y->link;
  free(s);
}

void print(stud *h)
{
  stud *p;
  p=h->link;
  printf("数据信息为:/n");
  while(p!=NULL)
  {
    printf("%s ",&*(p->name));
    p=p->link;
  }
}

void quit()
{
  exit(0);
}

void menu(void)
{
  clrscr();
  printf("/t/t/t单链表C语言实现实例/n");
  printf("/t/t|————————————————|/n");
  printf("/t/t| |/n");
  printf("/t/t| [1] 建 立 新 表 |/n");
  printf("/t/t| [2] 查 找 数 据 |/n");
  printf("/t/t| [3] 插 入 数 据 |/n");
  printf("/t/t| [4] 删 除 数 据 |/n");
  printf("/t/t| [5] 打 印 数 据 |/n");
  printf("/t/t| [6] 退 出 |/n");
  printf("/t/t| |/n");
  printf("/t/t| 如未建立新表,请先建立! |/n");
  printf("/t/t| |/n");
  printf("/t/t|————————————————|/n");
  printf("/t/t 请输入你的选项(1-6):");
}

main()
{
  int choose;
  stud *head,*searchpoint,*forepoint;
  char fullname[20];
 
  while(1)
  {
    menu();
    scanf("%d",&choose);
    switch(choose)
    {
      case 1:head=creat(N);
      break;
      case 2:printf("输入你所要查找的人的姓名:");
      scanf("%s",fullname);
      searchpoint=search(head,fullname);
      printf("你所查找的人的姓名为:%s",*&searchpoint->name);
      printf("/n按回车键回到主菜单。");
      getchar();getchar();
      break;
      case 3: printf("输入你要在哪个人后面插入:");
      scanf("%s",fullname);
      searchpoint=search(head,fullname);
      printf("你所查找的人的姓名为:%s",*&searchpoint->name);
      insert(searchpoint);
      print(head);
      printf("/n按回车键回到主菜单。");
      getchar();getchar();
      break;
      case 4:print(head);
      printf("/n输入你所要删除的人的姓名:");
      scanf("%s",fullname);
      searchpoint=search(head,fullname);
      forepoint=search2(head,fullname);
      del(forepoint,searchpoint);
      break;
      case 5:print(head);
      printf("/n按回车键回到主菜单。");
      getchar();getchar();
      break;
      case 6:quit();
      break;
      default:printf("你输入了非法字符!按回车键回到主菜单。");
      clrscr();
      menu();
      getchar();
    }
  }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值