| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 262 人关注过本帖
标题:链表的删除
只看楼主 加入收藏
双子若尘
Rank: 1
来 自:福州
等 级:新手上路
帖 子:21
专家分:0
注 册:2012-12-13
结帖率:100%
收藏
已结贴  问题点数:16 回复次数:2 
链表的删除




神呐,我的删除部分错哪了,求救啊
给定一个空链表,请按如下命令进行操作。




输入格式


  第一行一个整数N,表示有N(N<=100)个命令
   第二行至第N+1行,每行一个命令,命令的所有可能形式如下:
   
   A k
         表示向当前链表加入一个值为k的整数(k的绝对值小于INT_MAX)。
   Q
         表示查询
         D k
         表示删除当前链表中值为k的所有元素。符合条件的元素可能不存在。




输出格式


  对于A命令和D命令,程序不输出。对于每个Q命令,输出占一行,按元素的值从小到大的顺序输出链表中的所有元素,元素之间以一个空格分开。详细见样例。




样例输入


7
 A 3
 A 2
 Q
 D 2
 Q
 A 0
 Q
   




样例输出


2 3
 3
 0 3

#include<stdio.h>
#include<stdlib.h>
#define len sizeof(struct s)
struct s
{
    int num;
    struct s * next;
};
int main ()
{
    int k,i,n;
    char t,str[20];
    struct s *head=NULL;
    struct s *p,*p1,*p2,*q1,*q2,*r;
    scanf("%d",&n);
gets(str);
    for(i=0;i<n;i++)                     
    {
 gets(str);
       sscanf(str,"%c%d",&t,&k);
       if(t=='A')                              
       {
           
           scanf("%d",&k);
           if(head==NULL)                             //若头指针为空,将head指向num为k的指针p
           {
               p=(struct s*)malloc(len);
                p->num=k;
               p->next=NULL;
               head=p;
           }
           else
           {
               p=(struct s*)malloc(len);                       //头指针不为空,开始从小到大排
                p->num=k;
               p1=p2=head;
               while((p1->num<p->num)&&(p1->next!=NULL))    //条件:要找比k大的数,否则一个一个往下找
               {
                   p2=p1;
                   p1=p1->next;
               }
               if((p1->num>p->num)&&(p1->next==NULL))                  //
               {
                   head=p;
                   p->next=p1;
               }
               if((p1->num>p->num)&&(p1->next!=NULL))              
               {
                if(p1==head)
                {
                    head=p;p->next=p1;                      //若在表头
                }
                else
                {

                   p2->next=p;                                    //在表中
                   p->next=p1;
                }
               }
               if((p1->next==NULL)&&(p1->num<p->num))                                           //在表尾
               {
                   p1->next=p;
                   p->next=NULL;
               }
           }
       }
       else if(t=='D')                         //对于删除命令的处理            
       {
           scanf("%d",&k);
           if(head==NULL)                          //空指针不做处理
           continue;
           else
           {
               q1=q2=head;                             
               while(p1->num!=k&&p1->next!=NULL)                  //找相同的数字
               {
                   q2=q1;
                   q1=q1->next;
               }
               if(q1->num==k)
               {                                                        //在表头
                   if(q1==head)
                       head=q1->next;
                  
                    else                                             //在表中
                        q2->next=q1->next;
               }
              else                                      // 不存在k            
                   continue;
           }
       }
         else if(t=='Q')                                            //对于输出的处理
       {
           if(head==NULL)                                   // 空表不处理
           continue;
           else
           {
               r=head;
               while(r!=NULL)
               {
                   printf("%d ",r->num);                       //直接输出
                   r=r->next;
               }
               printf("\n");
           }
       }
}
 return 0;
}
搜索更多相关主题的帖子: 绝对值 元素 
2013-01-04 23:35
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:16 
程序代码:
else if(t=='D')                         //对于删除命令的处理          
{
//    scanf("%d",&k);//要这句干嘛?
    if(head==NULL)
        continue;
    else
    {
        q1 = q2 = head;                           
        while(q1->next != NULL && q1->num != k)
        {    //这里要反过来写,小技巧
            //这里应该是楼主写错了,是q1吧
            q2 = q1;
            q1 = q1->next;
        }
        while (q1 != NULL && q1->num == k)
        {    //注意是全部的 k哦
            if (q1 == head)//头单独处理
            {
                head = q1->next;
                free(q1);q1 = head;
                continue;
            }
            if (q1->next == NULL)//尾单独处理
            {
                q2->next = NULL;
                free(q1);break;
            }
            q2->next = q1->next;
            free(q1);//你一句free都没,这样不好
            q1 = q2->next;
        }
    }
}


[fly]存在即是合理[/fly]
2013-01-05 00:21
双子若尘
Rank: 1
来 自:福州
等 级:新手上路
帖 子:21
专家分:0
注 册:2012-12-13
收藏
得分:0 
回复 2楼 azzbcc
谢啦
2013-01-05 14:22
快速回复:链表的删除
数据加载中...
 
   



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

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