对双向链表的处理,单个,但是,有错误,就是在输入越界 时候,没有执行出错处理
/* 关于链表的删除,必须考虑到这个找到的节点为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的话,那么会是错误的,因为这个main中h是不变化的,所以,必须用返回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所以,必须对这个头指针 指向进行处理*/
/* 否则会导致错误很多的,但是,还有一点我么有实现,就是,这个要是我输入的值,不在这个范围之内,那么程序就会当机,会假死,
说明我的程序的健壮性存在问题,再就是了,恩,虽然我已经做了很大的处理,但是,老是程序不是这么多运行,怪事了,看了还是程序有问题,*/