鱼C论坛

 找回密码
 立即注册
查看: 4438|回复: 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函数有点问题
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)  
                {
                        if ((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;
                }
        }
}

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

使用道具 举报

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

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

充分利用递增顺序表这个规则,可以简化程序
在你的代码基础上 我加了几个函数如下。所有的代码如下通过visual stdio 2005编译运行测试成功
#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;
        Node* pNew = (Node*)malloc(sizeof(Node));
        pNew->data = elem;

        pNew->next = pCur->next;
        pCur->next = pNew;
}

//清除pHead开始的全部结点
void clear(Node *pHead)
{
        Node *pNode = pHead;
        Node *pFront = NULL;//指向pNode前面一个结点
        while (pNode)
        {
                pFront = pNode;
                pNode = pNode->next;
                free(pFront);
                pFront = NULL;
        }
        pHead = NULL;
}

void delMin(Node *head,int min)
{
        Node *pNode = head;
        while (head)
        {
                pNode = head->next;
                if (pNode)
                {
                        if (pNode->data > min)
                        {
                                head->next = pNode;
                                break;
                        }
                        else
                        {
                                head->next = pNode->next;
                                free(pNode);
                                pNode = NULL;
                        }
                }
        }
}

void delMax(Node *head,int max)
{
        Node *pNode = head;
        Node *pEndNode = head->next;   //指向结尾结点
        while (pEndNode)
        {
                pNode = pNode->next;

                if (pNode)
                {
                        if (pNode->data < max)
                        {
                                pEndNode = pNode;
                                continue;
                        }
                        else
                        {
                                clear(pNode);
                                pEndNode->next = NULL;
                                break;
                        }
                }
        }
}
void deleteObj(Node *head,int min,int max)
{
        delMin(head,min);
        delMax(head,max);
}

void del(Node *head,int min,int max)
{
        Node *pCur = head;
        Node *pTemp = NULL;
        Node *pCurrent = NULL;
        Node *pT = NULL;

        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)
        {
                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;
}

int _tmain(int argc, _TCHAR* argv[])
{
        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);

        deleteObj(head,min,max);
        PrintNode(head);
        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> 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-11-22 20:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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