对双向链表的处理,单个,但是,有错误,就是在输入越界 时候,没有执行出错处理

  对双向链表的处理,单个,但是,有错误,就是在输入越界 时候,没有执行出错处理

  /* 关于链表的删除,必须考虑到这个找到的节点为head的情况*/

  #include "stdio.h"

  #define A sizeof(struct st)         // 必须加上includes" stdlib.h"

  #include "stdlib.h"

  #include "conio.h"

  #include "liu.c"

  typedef struct st

  { int data;

    char name[10];

    struct st *f,*b;

   }ss;

  ss *list()

  { ss *h,*r,*s;

    r=s=(ss *)malloc(A);

    printf("inter dat :/n");

  

    scanf("%d",&s->data);

      gets(s->name);

    h=s;

    while(s->data!=0)

   { r->b=s;

     s->f=r;

     r=s;

    s=(ss *)malloc(A);

    printf("inter dat :/n");

  

    scanf("%d",&s->data);

      gets(s->name);  /* 这里不用格式化输入主要是为了输入的姓名之间可以写入空格*/

    }

    r->b=h;  /* 对链表的尾部进行处理*/

    h->f=r;

    return h;

   }

  /* 这个是那个输出函数*/

  void print(ss *head)

   {ss *p;

   p=head;

   if(head!=NULL)

    do

    { printf("%2d%3s/n",p->data,p->name);

      p=p->b;

    }while(p!=head);

  }

  /* 这个是一个删除函数*/

 ss *del(ss *head,int x)  /* 必须考虑当找到的值为HEAD的情况,然后返回的值是一个ss类型,指针,而不是直接调用main函数中的h这样

                            弃之不会变化的*/

 {ss *p,*r;

   p=head;

  if(head==NULL)

  { printf("kong biao :");

  exit (0);

  }

 

 

 else  

  {

while(p->b!=NULL&&p->data!=x)

   { r=p;

    p=p->b;

   }

   if(p->data==x)

  { if(p==head)

    head=p->b; /* 对这个head指针的情况进行处理 */

   else

    {  r->b=p->b;

       p->b->f=r; /* 因为是双向链表,所以必须对这个前指针进行处理,但是,开始我是指向了这个r->b错误了*/

      printf("学号 %d 姓名%s已经被删除了",p->data,p->name); 

      free(p);

      p=NULL;

   }

  

  }

  

  else   /*使我奇怪的就是,我换成p->data!=x的话,会导致错误 */

 { 

  printf("not found");

  

 }

  }

  return head; /*如果要是不是返回值,而是在main函数里面调用h的话,那么会是错误的,因为这个mainh是不变化的,所以,必须用返回head*/

  }

 

 ss  *found3(ss *head,int x) /*如果不加一个*,那么会出现很多的错误,,,A警告 danlia~2.c 122: 可能在'q'定义以前使用了它在 main 函数中

      错误 danlia~2.c 121: 非法的结构运算在 main 函数中

       错误 danlia~2.c 85: 不能执行所要求的类型转换在 found3 函数中*/

 { ss *p;

   p=head;

  if(head==NULL)

  { printf("not found:");

  }

 else  

 { while(p->data!=x&&p->b!=NULL)

     p=p->b;

   if(x==p->data)

 return p;

  else

  {AB 

  printf("没有找到你要的值:");    / *但是,这个剧没有找到*/

  }    

 }

 

}

 main()

 { ss *p,*w  ;

  int x;

  jasper

   p=list();

   print(p);

  printf("/n请输入你要查询的值:/n");

  scanf("%d",&x);  

  w=found3(p,x);

   printf("这个学生%s成绩%d/n",w->name,w->data);

   printf("/n请输入你要删除的值:/n");

   scanf("%d",&x);

    w=del(p,x);  / *main中的一干参数来返回这个*/

    print(w);  

  jasper2

 }

   /* 就是吧啊,额,再删除的时候了。再删除头结点的时候,老是错误恩,就是**不能为read所以,必须对这个头指针 指向进行处理*/

   /* 否则会导致错误很多的,但是,还有一点我么有实现,就是,这个要是我输入的值,不在这个范围之内,那么程序就会当机,会假死,

   说明我的程序的健壮性存在问题,再就是了,恩,虽然我已经做了很大的处理,但是,老是程序不是这么多运行,怪事了,看了还是程序有问题,*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值