| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 421 人关注过本帖
标题:二叉排序树问题,请帮忙纠错
取消只看楼主 加入收藏
陈威
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2009-10-18
结帖率:95%
收藏
 问题点数:0 回复次数:0 
二叉排序树问题,请帮忙纠错
二叉排序树的C程序——有的结果运行正确,有的结果会产生内存错误
程序中的数据在删除24时出现了内存错误!
#include <stdio.h>//输入六个整数45、24、53、12、37、9,插入数据元素13,删除数据元素24和53
#include <stdlib.h>
typedef struct BiTNode//结点结构
{
  int data;
  struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Insert(BiTree T,int e)//插入操作
{
    BiTree p=T, f=NULL, s;
    s=(BiTree)malloc(sizeof(BiTNode));
    s->data=e;  
    s->lchild=s->rchild=NULL;
    if (T==NULL) //插入 s 为新的根结点
    {  
T = s;  
    }
    else
{//查找插入位置
    while(p && p->data!=e)
{
          if (p->data>e) {f=p; p=p->lchild;}
          else {f=p; p=p->rchild;}
}
      if (p==NULL&&e <f->data)
            f->lchild = s;      // 插入 s 为 f 的左孩子
      else if(p==NULL&&e>f->data) f->rchild = s;    // 插入 s 为 f 的右孩子
  else {printf("插入出错!");exit(0);}
}
return  T;
}
void Delete(BiTree T,int x)
{
  BiTree f=NULL,p=T,q,s;

  while(p&&p->data!=x)
  {
  if(p->data>x){f=p;p=p->lchild;}
  else  
  {  f=p;p=p->rchild;}
  }
  if(p==NULL)  {printf("查找失败!");exit(0);}
  if(p->lchild==NULL)//左为空,重接右结点或左右均为空
  {
      if(f->lchild==p)  f->lchild=p->rchild;
  else  f->rchild=p->rchild;
  free(p);
  }
  else if(p->rchild==NULL)//右为空,重接左结点
  {
      if(f->lchild==p) f->lchild=p->lchild;
  else  f->rchild=p->lchild;
  free(p);
  }
  else//左右都不为空
  {
      q=p;
  s=p->lchild;
      while(s->rchild!=NULL)
  {
    q=s;s=s->rchild;
  }
      p->data=s->data;
  if(q==p)    p->lchild=s->lchild;
  else  q->rchild=s->lchild;
  free(p);
  }
}
void Inorder(BiTree T){  // 中序遍历二叉树
  if (T)
  {
      Inorder(T->lchild); // 遍历左子树
      printf("%d ",T->data);        // 访问结点
      Inorder(T->rchild);// 遍历右子树
  }
}
void Menu(BiTree T)
{
  int i,e;

  printf("1.插入元素\n");
  printf("2.删除元素\n");
  printf("3.结束\n");
  printf("请选择需要的功能:\n");

  scanf("%d",&i);
  switch(i)
  {
      case  1:
  printf("请输入要插入的元素:");
  scanf("%d",&e);
  T=Insert(T,e);
  printf("插入后中序遍历结果为:\n");
  Inorder(T);
  printf("\n");
  break;
  case  2:
  printf("请输入要删除的元素:");
  scanf("%d",&e);
  Delete(T,e);
  printf("删除后中序遍历结果为:\n");
  Inorder(T);
  printf("\n");
  break;
  default:    exit(0);  
  }
  Menu(T);
}
void main()
{
  int e,i;
  BiTree T;

  T=NULL;
  printf("请输入六个数构造二叉排序树:\n");
  for(i=1;i <7;i++)
  {
  scanf("%d",&e);
  T=Insert(T,e);
  }
  printf("此二叉排序树的中序遍历结果为:\n");
  Inorder(T);
  printf("\n");

  Menu(T);
}


希望高手帮忙看一下!
搜索更多相关主题的帖子: 纠错 
2010-01-13 16:55
快速回复:二叉排序树问题,请帮忙纠错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021016 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved