对双向链表的处理,单个,但是,有错误,就是在输入越界 时候,没有执行出错处理
2010-05-16 09:22
363 查看
对双向链表的处理,单个,但是,有错误,就是在输入越界 时候,没有执行出错处理
/* 关于链表的删除,必须考虑到这个找到的节点为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所以,必须对这个头指针 指向进行处理*/
/* 否则会导致错误很多的,但是,还有一点我么有实现,就是,这个要是我输入的值,不在这个范围之内,那么程序就会当机,会假死,
说明我的程序的健壮性存在问题,再就是了,恩,虽然我已经做了很大的处理,但是,老是程序不是这么多运行,怪事了,看了还是程序有问题,*/
/* 关于链表的删除,必须考虑到这个找到的节点为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所以,必须对这个头指针 指向进行处理*/
/* 否则会导致错误很多的,但是,还有一点我么有实现,就是,这个要是我输入的值,不在这个范围之内,那么程序就会当机,会假死,
说明我的程序的健壮性存在问题,再就是了,恩,虽然我已经做了很大的处理,但是,老是程序不是这么多运行,怪事了,看了还是程序有问题,*/
相关文章推荐
- 项目有叉号, 但是没有代码错误的时候, 是JDK版本的问题
- 读取ORACLE10G的CLOB类型的内容时出错,当我输入超过10000的汉字时,读取的时候出错误
- MOSS 配置SSO的时候可能遇到"您没有执行此操作的权限"的错误
- phpcms网站前台页面访问正常,但是输入后台地址后,一片空白,没有任何错误提示
- 记录Sqlserver2012附加Sqlserver2008的数据库出错的解决方案一、摘要 最近在实验里面用台式编写好了一个软件,想移植到家里的笔记本上。在附加数据的时候却出现了错误,具体也没有提示
- 使用eclipse的maven项目时,没有错误,但是就是各种异常【解决办法】
- JavaScript某行代码执行的时候,用到了某个变量,但是这个变量根本找不到在哪里定义了(或者说看上去根本没有定义过)是怎么回事,是怎么执行的?
- 大家帮忙看看c++中派生类发生浅拷贝,但是在析构时候怎么没有内存错误!求解!
- phpcms网站前台页面访问正常,但是输入后台地址后,一片空白,没有任何错误提示
- 一个错误的链表程序 ——编译通过,执行出错。自己没有好的调试技术,没有找到错误;而靠经验得逐行细查——费时间
- 【c语言】编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制。
- /*c++中二维数组的输入正常,但是输出有问题,感觉就是输入进去但是没有保存下 */
- Watir: 当出现错误提示AutoItX3.dll 没有注册的时候,该怎么处理?
- var dataObj=eval("("+data+")");//转换为json对象(解决在ajax返回json格式数据的时候明明正确的获取了返回值但是却就是进不去success方法的问题。格式错误)
- 使用NSThread创建线程,执行NSTask,但是异步读取pipe的时候出错
- 编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制
- C语言 编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制
- 安装python3的时候就是输入python3死活没有反应的解决方法
- SSH整合时候Hibernate正确执行了save方法,但是数据没有保存到数据库
- 从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使用让这个程序能够处理的输入行的长度没有限制。