| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5345 人关注过本帖
标题:刚学的新手求助!!!郁闷(单链表中删除表中所有大于x且小于y的元素)
只看楼主 加入收藏
专一的丸子
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2010-4-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
刚学的新手求助!!!郁闷(单链表中删除表中所有大于x且小于y的元素)
程序写出来了也没有错误,但是就是实现不了删除的命令,请各位懂数据结构的大虾们帮忙一下
程序代码:
//已知线性表中的元素以值递增有序排列,并以单链表作存储结构。
//试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef int ElemType;
typedef  struct LNode
   { ElemType data;                      /* 数据子域      */
     struct LNode *next;                 /* 指针子域      */
   }LNode;                               /* 结点结构类型  */
LNode *L; 

/*  函数声明  */
LNode *creat_L();
void  out_L(LNode *L);
ElemType delete_L(LNode *L,int i);

/*  建立线性链表*/
LNode *creat_L()
{
    LNode *h,*p,*s;  ElemType x;
    h=(LNode *)malloc(sizeof(LNode));                 /* 分配头结点 */
    h->next=NULL;
    p=h; 
    printf("输入一串数字(以-1结束):\ndata= ");
    scanf("%d",&x);                                   /*  输入第一个数据元素 */
    while( x!=-1)                                     /*  输入-1,结束循环 */
    {
        s=(LNode *)malloc(sizeof(LNode));             /*  分配新结点 */
        s->data=x;  s->next=NULL;
        p->next=s;  p=s;
        printf("data= ");
        scanf("%d",&x);                               /* 输入下一个数据*/
    }
    return(h);

 } /* creat_L  */

/* 输出单链表中的数据元素*/
void out_L(LNode *L)
{
    LNode *p;
    p=L->next;
    printf("\n数据是:");
    while(p!=NULL)
    { 
        printf("%5d",p->data);
        p=p->next;
    }
} /* out_link */

/* 删除大于x小于y的值*/
void delete_L(LNode *L,int a,int b)

 {
    LNode *p,*q;
    p=L;
    ElemType y;
    if(p->next==NULL) printf("ERROR:链表为空");
    while(p->next->data >a && p->next->data <b)
    {
        q=p->next; y=q->data;
        p->next=q->next; free(q);
        p=p->next;
    }
  }  /* delete_L */

void main()
{
    int a,b;
    L=creat_L( );  out_L(L);
    printf("\n\n请输入你要删除的元素的范围x和y:\n"); 
    scanf("%d%d",&a,&b);
    delete_L(L,a,b);  out_L(L);
    printf("\n");
} /* main */



搜索更多相关主题的帖子: 删除 元素 单链 
2010-04-10 15:28
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
while(p->next->data >a && p->next->data <b)
如果一个节点不是要删除的岂不就结束了

★★★★★为人民服务★★★★★
2010-04-10 20:50
专一的丸子
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2010-4-8
收藏
得分:0 
问题是现在我输入已有节点,它也没有调用删除,结果还是输入的数据
例如:输入1 2 3 4 5   删除范围2<i<4的数
      输出结果还会是 1 2 3 4 5

可以帮我调试一下吗
2010-04-10 21:32
编程小呆
Rank: 2
来 自:西电
等 级:论坛游民
帖 子:31
专家分:23
注 册:2010-3-20
收藏
得分:5 
我也是新手,发现个问题,while循环语句似乎不对,不能遍历整个链表,
按你这种写法会漏掉一般的数据、、、
2010-04-10 21:51
编程小呆
Rank: 2
来 自:西电
等 级:论坛游民
帖 子:31
专家分:23
注 册:2010-3-20
收藏
得分:0 
是一半的数据
2010-04-10 21:52
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
回复 3楼 专一的丸子
因为第一个节点时,不符合删除条件,那个循环就结束了,那里还会删除什么东西啊!

★★★★★为人民服务★★★★★
2010-04-10 21:52
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:5 
另外一个问题就是,假如头一个节点被删除了,那么main()中的L指向哪里?

★★★★★为人民服务★★★★★
2010-04-10 21:54
编程小呆
Rank: 2
来 自:西电
等 级:论坛游民
帖 子:31
专家分:23
注 册:2010-3-20
收藏
得分:0 
对,应该那个删除的基本操作不能那样写、、、、
2010-04-10 21:58
被爱惯坏
Rank: 2
等 级:论坛游民
帖 子:1
专家分:10
注 册:2010-4-10
收藏
得分:10 
//已知线性表中的元素以值递增有序排列,并以单链表作存储结构。
//试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef int ElemType;
typedef  struct LNode
   { ElemType data;                      /* 数据子域      */
     struct LNode *next;                 /* 指针子域      */
   }LNode;                               /* 结点结构类型  */
LNode *L;

/*  函数声明  */
LNode *creat_L();
void delete_L(LNode *L,int i);  //返回值格式变为空

/*  建立线性链表*/
LNode *creat_L()
{
    LNode *h,*p,*s;  ElemType x;
    h=(LNode *)malloc(sizeof(LNode));                 /* 分配头结点 */
    h->next=NULL;
    p=h;
    printf("输入一串数字(以-1结束):\ndata= ");
    scanf("%d",&x);                                   /*  输入第一个数据元素 */
    while( x!=-1)                                     /*  输入-1,结束循环 */
    {
        s=(LNode *)malloc(sizeof(LNode));             /*  分配新结点 */
        s->data=x;  s->next=NULL;
        p->next=s;  p=s;
        printf("data= ");
        scanf("%d",&x);                               /* 输入下一个数据*/
    }
    return(h);
} /* creat_L  */

/* 输出单链表中的数据元素*/
void out_L(LNode *L)
{
    LNode *p;
    p=L->next;
    printf("\n数据是:");
    while(p!=NULL)
    {
        printf("%5d",p->data);
        p=p->next;
    }
} /* out_link */

/* 删除大于x小于y的值*/
void delete_L(LNode *L,int a,int b)
{
    LNode *p,*q;
    p=L;
    q=p;
    p=p->next;
    if(p==NULL) printf("ERROR:链表为空");
    while(p!=NULL)
    {
   
        if((p->data >a) && (p->data <b))
        {  q->next=p->next;
           free(p);
            p=q->next;
        
        }
        else
        {  q=p;
            p=p->next;
        }
    }
  }  /* delete_L */

void main()
{
    int a,b;
    L=creat_L( );  out_L(L);
    printf("\n\n请输入你要删除的元素的范围x和y:\n");
    scanf("%d%d",&a,&b);
    delete_L(L,a,b);  out_L(L);
    printf("\n");
} /* main */

粉红颜色为修改后模块

路还很遥远。
2010-04-11 00:34
studythec
Rank: 1
来 自:安徽阜阳
等 级:新手上路
帖 子:31
专家分:5
注 册:2010-3-13
收藏
得分:0 
#include <iostream.h>
#include <string.h>
void main()
{
    int i,j,x,y;
    int n=0;                      //定义记数器
    int a[10];                     //定义数组
    for(i=0;i<10;i++)               // 数组输入
        cin>>a[i];
    for(i=0;i<10;i++)              //数组输出
        cout<<a[i]<<" ";
    cout<<endl;
    cin>>x;                      //输入范围
    cin>>y;
    for(i=0;i<10;i++)                //属于限定的范围,赋值为-1,并记数
        if(a[i]>=x&&a[i]<=y)
        {
            a[i]=-1;
            n++;
        }
    for(i=9;i>=0;i--)                 //移动,使-1向后移
        if(a[i]==-1)
        {
            for(j=i;j<10;j++)
                a[j]=a[j+1];
        }
    for(i=0;i<10-n;i++)                       //数组输出   
            cout<<a[i]<<" ";
    cout<<endl;
}

菜鸟一个,在校学习,多多指教!
2010-04-11 19:08
快速回复:刚学的新手求助!!!郁闷(单链表中删除表中所有大于x且小于y的元素) ...
数据加载中...
 
   



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

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