鱼C论坛

 找回密码
 立即注册
查看: 4035|回复: 6

求大神看看我这个程序那里错了

[复制链接]
发表于 2013-5-15 21:22:56 | 显示全部楼层 |阅读模式
1鱼币
已知线性表的元素按递增顺序排列,并以带头结点的单链表作为存储结构。试编写一个删除表中所有值大于min并且小于max的元素的算法。
函数原型:void del(struct node *head,int min,int max);
单链表结点结构为:
struct node
{   int data;
    struct node *next;
};

Input

第一行 包含一个n,代表链表中所含元素的个数。
第二行 包含n个数,代表链表中的元素。
第三行 max 与min ( max > min )。
注意:测试数据包含多组
Output

要求删除[min,max]区间内的所有元素,若不存在,则不执行任何操作。
Sample Input
5
1 2 3 4 5
2 3
6
12 5 6 4 6 9
2 4
Sample Output
1 4 5
12 5 6 6 9
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
    int data;
    struct node *next;
}Node;
Node *CreatNode()
{
    Node *p = (Node*)malloc(sizeof(Node));
    p->next = NULL;
    return p;
}
void InsertNodeElem(Node *head,int elem)
{
    Node *pCur = head,*pNew = (Node*)malloc(sizeof(Node));
    pNew->data = elem;

    pNew->next = pCur->next;
    pCur->next = pNew;
}
void del(Node *head,int min,int max)
{
    Node *pCur = head,*pTemp,*pCurrent,*pT;
       while(pCur!=NULL)
       {
           pT = pCur->next;pTemp = pT;
           if((pT==NULL) && (pCur->data >= min) && (pCur->data<=max))
           {
               free(pCur);
               break;
           }

        if(pTemp->data >= min && pTemp->data <= max)
        {
            pCurrent = pTemp;
            if(pCurrent->next==NULL)
            {
                pCur->next = NULL;
                free(pCurrent);
                break;
            }
            pCur->next = pCurrent->next;
            free(pTemp);
        }
        else
        {
            pCur = pCur->next;
        }
       }



}
void PrintNode(Node *head)
{
    Node *pCur = head->next;
    while(pCur!=NULL)
    {
        printf("%d ",pCur->data);
        pCur = pCur ->next;
    }
}
int NodeLength(Node *head)
{
    int len = 0;
    Node *pCur = head->next;
    while(pCur!=NULL)
    {
        len++;
        pCur = pCur ->next;
    }
    return len;
}
void main()
{
    Node *head = CreatNode();
    int len = 0,i = 0,elem = 0,max = 0,min = 0;
    scanf("%d",&len);
    for(i=0;i<len;i++)
    {
       scanf("%d",&elem);
       InsertNodeElem(head,elem);
    }
    scanf("%d %d",&min,&max);
    del(head,min,max);
    PrintNode(head);
}
应该是删除函数有错,

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-15 21:54:16 | 显示全部楼层
确实是del函数有点问题

  1. void del(Node *head,int min,int max)
  2. {
  3.         Node *pCur = head,*pTemp,*pCurrent,*pT;
  4.         while(pCur!=NULL)
  5.         {
  6.                 pT = pCur->next;pTemp = pT;
  7.                 if(pT==NULL)  
  8.                 {
  9.                         if ((pCur->data >= min) && (pCur->data<=max))
  10.                         {
  11.                                 free(pCur);
  12.                         }
  13.                         break;
  14.                 }

  15.                 if(pTemp->data >= min && pTemp->data <= max)
  16.                 {
  17.                         pCurrent = pTemp;
  18.                         if(pCurrent->next==NULL)
  19.                         {
  20.                                 pCur->next = NULL;
  21.                                 free(pCurrent);
  22.                                 break;
  23.                         }
  24.                         pCur->next = pCurrent->next;
  25.                         free(pTemp);
  26.                 }
  27.                 else
  28.                 {
  29.                         pCur = pCur->next;
  30.                 }
  31.         }
  32. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-15 22:36:00 | 显示全部楼层
本帖最后由 熊文杰 于 2013-5-15 22:38 编辑

这个题目首先第一个要抓住的要点是
按递增顺序排列
既然是按照递增的顺序排列,那就简单了。因为顺序是排好的,
1.只要找到第一个比min大的结点,让pHead头指针指向那个结点,此结点之前的全部free掉。
2.找到最后一个比max小的结点,这个结点就是最后一个尾结点。这个结点之后的全部free掉。

充分利用递增顺序表这个规则,可以简化程序
在你的代码基础上 我加了几个函数如下。所有的代码如下通过visual stdio 2005编译运行测试成功
  1. #include <stdio.h>
  2. #include <stdlib.h>
复制代码
  1. typedef struct node
  2. {
  3.         int data;
  4.         struct node *next;
  5. }Node;
  6. Node *CreatNode()
  7. {
  8.         Node *p = (Node*)malloc(sizeof(Node));
  9.         p->next = NULL;
  10.         return p;
  11. }
  12. void InsertNodeElem(Node *head,int elem)
  13. {
  14.         Node *pCur = head;
  15.         Node* pNew = (Node*)malloc(sizeof(Node));
  16.         pNew->data = elem;

  17.         pNew->next = pCur->next;
  18.         pCur->next = pNew;
  19. }

  20. //清除pHead开始的全部结点
  21. void clear(Node *pHead)
  22. {
  23.         Node *pNode = pHead;
  24.         Node *pFront = NULL;//指向pNode前面一个结点
  25.         while (pNode)
  26.         {
  27.                 pFront = pNode;
  28.                 pNode = pNode->next;
  29.                 free(pFront);
  30.                 pFront = NULL;
  31.         }
  32.         pHead = NULL;
  33. }

  34. void delMin(Node *head,int min)
  35. {
  36.         Node *pNode = head;
  37.         while (head)
  38.         {
  39.                 pNode = head->next;
  40.                 if (pNode)
  41.                 {
  42.                         if (pNode->data > min)
  43.                         {
  44.                                 head->next = pNode;
  45.                                 break;
  46.                         }
  47.                         else
  48.                         {
  49.                                 head->next = pNode->next;
  50.                                 free(pNode);
  51.                                 pNode = NULL;
  52.                         }
  53.                 }
  54.         }
  55. }

  56. void delMax(Node *head,int max)
  57. {
  58.         Node *pNode = head;
  59.         Node *pEndNode = head->next;   //指向结尾结点
  60.         while (pEndNode)
  61.         {
  62.                 pNode = pNode->next;

  63.                 if (pNode)
  64.                 {
  65.                         if (pNode->data < max)
  66.                         {
  67.                                 pEndNode = pNode;
  68.                                 continue;
  69.                         }
  70.                         else
  71.                         {
  72.                                 clear(pNode);
  73.                                 pEndNode->next = NULL;
  74.                                 break;
  75.                         }
  76.                 }
  77.         }
  78. }
  79. void deleteObj(Node *head,int min,int max)
  80. {
  81.         delMin(head,min);
  82.         delMax(head,max);
  83. }

  84. void del(Node *head,int min,int max)
  85. {
  86.         Node *pCur = head;
  87.         Node *pTemp = NULL;
  88.         Node *pCurrent = NULL;
  89.         Node *pT = NULL;

  90.         while(pCur!=NULL)
  91.         {
  92.                 pT = pCur->next;
  93.                 pTemp = pT;
  94.                 if((pT==NULL) && (pCur->data >= min) && (pCur->data<=max))
  95.                 {
  96.                         free(pCur);
  97.                         break;
  98.                 }

  99.                 if(pTemp->data >= min && pTemp->data <= max)
  100.                 {
  101.                         pCurrent = pTemp;
  102.                         if(pCurrent->next==NULL)
  103.                         {
  104.                                 pCur->next = NULL;
  105.                                 free(pCurrent);
  106.                                 break;
  107.                         }
  108.                         pCur->next = pCurrent->next;
  109.                         free(pTemp);
  110.                 }
  111.                 else
  112.                 {
  113.                         pCur = pCur->next;
  114.                 }
  115.         }



  116. }
  117. void PrintNode(Node *head)
  118. {
  119.         Node *pCur = head->next;
  120.         while(pCur)
  121.         {
  122.                 printf("%d ",pCur->data);
  123.                 pCur = pCur ->next;
  124.         }
  125. }
  126. int NodeLength(Node *head)
  127. {
  128.         int len = 0;
  129.         Node *pCur = head->next;
  130.         while(pCur!=NULL)
  131.         {
  132.                 len++;
  133.                 pCur = pCur ->next;
  134.         }
  135.         return len;
  136. }

  137. int _tmain(int argc, _TCHAR* argv[])
  138. {
  139.         Node *head = CreatNode();
  140.         int len = 0,i = 0,elem = 0,max = 0,min = 0;
  141.         scanf("%d",&len);
  142.         for(i=0;i<len;i++)
  143.         {
  144.                 scanf("%d",&elem);
  145.                 InsertNodeElem(head,elem);
  146.         }
  147.         scanf("%d %d",&min,&max);

  148.         deleteObj(head,min,max);
  149.         PrintNode(head);
  150.         return 0;
  151. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-16 21:49:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-19 16:41:50 | 显示全部楼层
我是来领 鱼币的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-21 15:37:11 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-7 17:09:55 | 显示全部楼层
好像有些标点什么的是检测不出的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 03:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表