zhuaaaaaazhu
zhuaaaaaazhu
采纳率33.3%
2017-04-02 14:40 浏览 1.5k
已采纳

自己写的链表小程序,请大神帮忙看看

以下是一段链表程序,链表创建和输出函数都没有问题,但是这个函数执行时好像陷入了死循环,我找不到问题在哪里,大神们帮忙看下,多谢了

void deletelink(int min,int max,linknode *phead)//给出增序链表头指针,删除大于 min 小于max的链表
{
linknode *pa,*pb,*pc,*pnow=phead;
while(pnow->next!=NULL&&pnow->next->data<=min)
{
pnow=pnow->next;
}//链表有头结点,假设链表有9元素,头结点值为0;0-1-2-3-4-5-6-7-8-9,头结点不包括在内,min=2,max=5。先让pnow循环 至 2处
pa=pnow;//pa=2
pnow=pnow->next;
pb=pnow; //pb=pnow=3
if(pnow!=NULL)//若pnow不空
{
while(pnow!=NULL&&pnow->data {
pnow=pnow->next;
}//让pnow循环至 5 处
pa->next=pnow;//2 指向 5
while(pb!=pnow)//删除 3开始 一直到5之前的节点
{
pc=pb;
pb=pb->next;
free(pc);
}
}
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

13条回答 默认 最新

  • 已采纳
    gaozeng851998821 gaozeng851998821 2017-04-02 15:45

    倒数第三句程序应该是 deletelink(2,5,phead);

    点赞 评论 复制链接分享
  • qq_36797706 qq_36797706 2017-04-02 15:07

    目测第一个循环出来时。pa指向的值为3

    点赞 评论 复制链接分享
  • gaozeng851998821 gaozeng851998821 2017-04-02 15:12

    第二个循环条件 改为 while(pnow!=NULL&&pnow->data < max)

    点赞 评论 复制链接分享
  • zhuaaaaaazhu zhuaaaaaazhu 2017-04-02 15:26

    程序在这里图片说明

    点赞 评论 复制链接分享
  • gaozeng851998821 gaozeng851998821 2017-04-02 15:27

    你是只用你给的例子测试的,还是用了其他的测试用例?

    如果 head 的数据 大于 min ,那程序是不对的。

    点赞 评论 复制链接分享
  • zhuaaaaaazhu zhuaaaaaazhu 2017-04-02 15:28

    我再发一遍程序。。。
    void deletelink(int min,int max,linknode *phead)//给出增序链表头指针,删除大于 min 小于max的链表
    {
    linknode *pa,*pb,*pc,*pnow=phead;
    while(pnow->next!=NULL&&pnow->next->data<=min)
    {
    pnow=pnow->next;
    }//链表有头结点,假设链表有9元素,头结点值为0;0-1-2-3-4-5-6-7-8-9,头结点不包括在内,min=2,max=5。先让pnow循环 至 2处
    pa=pnow;//pa=2
    pnow=pnow->next;
    pb=pnow; //pb=pnow=3
    if(pnow!=NULL)//若pnow不空
    {
    while(pnow!=NULL&&pnow->data {
    pnow=pnow->next;
    }//让pnow循环至 5 处
    pa->next=pnow;//2 指向 5
    while(pb!=pnow)//删除 3开始 一直到5之前的节点
    {
    pc=pb;
    pb=pb->next;
    free(pc);
    }
    }
    }

    点赞 评论 复制链接分享
  • gaozeng851998821 gaozeng851998821 2017-04-02 15:32

    函数的鲁棒性不是很好,最好返回结点删除后的链表头指针。

    点赞 评论 复制链接分享
  • ndsc_ TravelerSZ 2017-04-02 15:32

    先确定边界值的前一个元素。 pa是imin的前一个元素,pb是max的前一个元素。

    void deletelink(int min, int max, linknode *phead)//给出增序链表头指针,删除大于 min 小于max的链表
    {
    linknode *pa, *pb, *pc, *pnow = phead;
    while (pnow->next != NULL&&pnow->next->data <= min)
    {
    pnow = pnow->next;
    }//链表有头结点,假设链表有9元素,头结点值为0;0-1-2-3-4-5-6-7-8-9,头结点不包括在内,min=2,max=5。先让pnow循环 至 2处
    pa = pnow;//pa为2

    while (pnow->next != NULL&&pnow->next->data < max){
        pnow = pnow->next;
    }//让pnow循环至 4 处
    pb = pnow;
    
    pnow = pa;
    pa->next = pb->next;
    while (pb->next != pnow)//删除 3开始 一直到5之前的节点
    {
        pc = pnow;
        pnow = pnow->next;
        free(pc);
    }
    

    }

    点赞 评论 复制链接分享
  • gaozeng851998821 gaozeng851998821 2017-04-02 15:37

    能把你的测试程序复制粘贴一下吗?

    点赞 评论 复制链接分享
  • zhuaaaaaazhu zhuaaaaaazhu 2017-04-02 15:37

    上一楼的大哥图片说明

    点赞 评论 复制链接分享
  • zhuaaaaaazhu zhuaaaaaazhu 2017-04-02 15:37

    #include
    #include
    typedef struct node
    {
    int data;
    struct node *next;
    }linknode;
    linknode *createl()
    {
    linknode *phead,*ptail,*pnew;
    ptail=phead=(linknode *)malloc(sizeof(linknode));
    ptail->data=0;
    int i,N;
    printf("input the length of link:");
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {

        pnew=(linknode *)malloc(sizeof(linknode));
        pnew->next=NULL;
        scanf("%d",&pnew->data);
        ptail->next=pnew;
        ptail=pnew;
    }
    return phead;
    

    }//链表取值创建
    void takesame(linknode *phead)
    {
    linknode *preal,*pa;
    preal=phead->next;
    while(preal->next!=NULL)//为什么要指针的下一个不等于空才行,而本身不等于空则会导致程序错误?
    {
    if(preal->data==preal->next->data)
    {
    pa=preal->next;
    preal->next=pa->next;
    free(pa);
    }
    else
    {
    preal=preal->next;
    }
    }
    }//去重复元素函数
    void linkprintf(linknode *phead)
    {
    phead=phead->next;
    if(phead==NULL)printf("a empty link!");
    while(phead!=NULL)
    {
    if(phead->next!=NULL)
    {
    printf("%d -> ",phead->data);
    }
    else
    {
    printf("%d\n",phead->data);
    }
    phead=phead->next;
    }
    }//链表输出函数
    void deletelink(int min,int max,linknode *phead)//给出增序链表头指针,删除大于 min 小于max的链表
    {
    linknode *pa,*pb,*pc,*pnow=phead;
    while(pnow->next!=NULL&&pnow->next->data<=min)
    {
    pnow=pnow->next;
    }//链表有头结点,假设链表有9元素,头结点值为0;0-1-2-3-4-5-6-7-8-9,头结点不包括在内,min=2,max=5。先让pnow循环 至 2处
    pa=pnow;//pa=2
    pnow=pnow->next;
    pb=pnow; //pb=pnow=3
    if(pnow!=NULL)//若pnow不空
    {
    while(pnow!=NULL&&pnow->data {
    pnow=pnow->next;
    }//让pnow循环至 5 处
    pa->next=pnow;//2 指向 5
    while(pb!=pnow)//删除 3开始 一直到5之前的节点
    {
    pc=pb;
    pb=pb->next;
    free(pc);
    }
    }
    }
    int main()
    {
    linknode *phead=createl();
    linkprintf(phead);
    takesame(phead);
    linkprintf(phead);
    delete(2,5,phead);
    linkprintf(phead);
    return 0;
    }

    点赞 评论 复制链接分享
  • zhuaaaaaazhu zhuaaaaaazhu 2017-04-02 15:40

    找到原因了。。。。。。。。。。。。delete函数不对,应该是deletelink。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    真是麻烦各位大佬了。。对不起。。。

    点赞 评论 复制链接分享
  • zhuaaaaaazhu zhuaaaaaazhu 2017-04-02 15:41

    图片说明

    点赞 评论 复制链接分享

相关推荐