指针和链表2


#include <stdio.h> 

#include <conio.h> 

#include <string.h> 

#include <stdlib.h>

#define N 3

typedef struct node

{

  char name[20];

  struct node *link;

}stud;

命名这个多结构体一个新的称号为stud。

stud * creat(int n) /*建立单链表的函数*/

{

  stud *p,*h,*s;  

   inti;

  if((h=(stud *)malloc(sizeof(stud)))==NULL) 

   {

     printf("不能分配内存空间!");

     exit(0);

   }

  h->name[0]='\0'; 

  h->link=NULL; 

  p=h;  

把h的地址给p如果h的动态内存为空则显示不能分配内存清空h的name属性h的下一项为空

        

  for(i=0;i<N;i++)

   {

    if((s= (stud *) malloc(sizeof(stud)))==NULL)

     {

       printf("不能分配内存空间!");

       exit(0);

     }

如果s的内存为空则显示不能分配内存

    p->link=s;    

    printf("请输入第%d个人的姓名:",i+1);

    scanf("%s",s->name);

    s->link=NULL;

    p=s;

   } 

p向s提出分配,把s的name给p。s的下一个指针地址为空,永远保证是最后一个。而且一定要让p的下一个link得到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;

   }

 把头指针的下一项给p如果p为空,y获得p中name的值,然后让y和x比较,如果x和y的值相同也就是等于0.就证明找到了,否则就让p得到它的下一个指针数。再次重复,让y获得p的地址中name的地址。如果最后还是没有的话,说明并没有这个数据,显示没有。

  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;

     }

   }

 头指针 的link指针给p,h的值赋予给s当p不等于空时,y得到p地址的名字 ,两者比较如果y和x相同说明找到了人,如果没有就返还,找到p就得到向下一个继续,s也得到下一个P。然后循环在进行比较。

  if(p==NULL)

   printf("没有查找到该数据!");

}

void insert(stud *p) /*插入函数,在指针p后插入*/

{

  char stuname[20];

  stud *s; /*指针s是保存新结点地址的*/

  if((s= (stud *) malloc(sizeof(stud)))==NULL)//新定义的s指针的动态分配在stud中如果为空就表示不可分配空间显示退出,如果不为空就证明有空间可以使用。设定stuname的值然后让s获取,在把p的下一个给s的下一个,然后s给p的下一个。

   {

    printf("不能分配内存空间!");

    exit(0);

   }

  printf("请输入你要插入的人的姓名:");

  scanf("%s",stuname);

  strcpy(s->name,stuname); 

   s->link=p->link; /*把新结点的链域指向原来p结点的后继结点*/

   p->link=s;/*p结点的链域指向新结点*/

}

设定stuname的值然后让s获取,在把p的下一个给s的下一个,然后s给p的下一个。如果动态内存分配为空则退出。

才用插空取值的方法,把上一个数提前给要插入的数,完成传递,否则会丢失。 

void del(stud *x,stud *y) 

{

  stud*s;

  s=y;

  x->link=y->link;  

  free(s);

}

 

  把要被删掉的数先给后面,然后在进行前向传递,把Y的后方的值给Y的前方,这样Y就没用了最后在清除掉S就算完成了删除任务。

void print(stud *h)

{

  stud *p;

  p=h->link;  

  printf("数据信息为:\n");

  while(p!=NULL)

   {

    printf("%s \n",&*(p->name));

    p=p->link;

   }

}

 

 

void quit()

{

 exit(0);

}

void menu(void)

{

   system("cls");

   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("你输入了非法字符!按回车键回到主菜单。");

          system("cls");

          menu();

           getchar();

 最后运用了“选择” ,保证是一个死循环,这样界面就会无限刷新,然后在阻挡函数,这样就可以选择了,否则无法选择。

      }

   }

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值