回 帖 发 新 帖 刷新版面

主题:[讨论]一个搞不掂的程序!

这个程序弄了很久,但老是不能如我所意~




#include<iostream.h>
#include<stdlib.h>
typedef int ElemType;
struct LNode
{
    ElemType data;
    LNode *next;
};//定义LNode
void InitList(LNode* &HL)//初始化链表
{
    HL=NULL;
}
void TraverseList(LNode* HL)//输出结点
{
    while(HL!=NULL){
        cout<<HL->data<<" ";
        HL=HL->next;
    }
    cout<<endl;
}
bool InsertList(LNode* &HL,ElemType item,int pos)//插入结点
{
    if(pos<-1){
        cout<<"POS值无效"<<endl;
        return false;
    }
    LNode* newptr;
    newptr=new LNode;
    newptr->data=item;
    LNode *cp=HL;
    LNode *ap=NULL;
    if(pos==0){     //按结点的值插入
        while(cp!=NULL){
            if(item<cp->data)break;
            else {
                ap=cp;
                cp=cp->next;
            }
        }

    }
    else if(pos==-1)//插入队尾
        while(cp!=NULL){ap=cp;cp=cp->next;}
        else{  //按i的值插入
            int i=0;
            while(cp!=NULL){
                i++;
                if(i==pos)break;
                else{
                    ap=cp;
                    cp=cp->next;
                }
            }
            if(cp==NULL&&i+1<pos){
                cout<<"pos值超出单链表长度+1"<<endl;
                return false;
            }
        }
        if(ap==NULL)//插表头
        {
            newptr->next=HL;
            HL=newptr;
        }
        else
        {
            newptr->next=cp;
            ap->next=newptr;
        }
        return true;
}
void DelMin(LNode* &HL)//删除最小值
{  
    LNode *cp=HL;
    LNode *ap=cp->next;
    LNode *min=ap;              
    LNode *premin=cp;
    
    while(ap){
    if(ap->data<min->data)
    {  
        min=ap;
        premin=cp;
    }

    cp=cp->next;
    ap=ap->next;
    }
    premin->next=min->next;
    free(min);

}
void main()
{
    int a[12]={10,11,12,13,14,15,16,17,18,19,20,22};
    int i;

     LNode *t;
    InitList(t);
    for(i=0;i<12;i++)InsertList(t,a[i],i+1);
    TraverseList(t);

DelMmin(t);

    TraverseList(t);

}
     这个程序运行结构为10 11 12 13 14 15 16 17 18 19 20 22
                        10 12 13 14 15 16 17 18 19 20 22
      本来是10最小,但它却把11给删除掉了,请教一个高手,如何修改才能正确删除最小的值~~~

回复列表 (共4个回复)

沙发

void DelMin(LNode* &HL)//里
不能也不需要改变cp的值,这个变量甚至不需要
在最好你要考虑最小节点为第一个的特殊情况
因为此时premin与min都指向同一个节点

板凳

谢谢,我尝试一下先

3 楼

可能比较繁琐,但是思路应该比较清楚
注意,要考虑边界问题
bool DelminVal(LNode *&HL)
{
    LNode *minNode = HL;
    LNode *currNode = HL;
    LNode *preMinNode = HL;
    LNode *preNode = HL;

    if (NULL == HL)
    {
        cout << " The linktable is empty!"
            return true;
    }

    // 考虑链表只有一个节点的情形
    if (NULL == HL->next)
    {
        delete HL;
        HL = NULL;
        return true;
    }

    // 如果链表中有多个同样大小的最小值,则
    // 默认情况下是删除第一个最小值
    currNode = preNode->next;
    // 考虑只有两个节点的情形
    if (NULL == currNode->next)
    {
        if (preNode->data <= currNode->data)
        {
            HL = currNode;
            delete preNode;
            preNode = NULL;
        }
        else
        {
            HL->next = NULL;
            delete currNode;
            currNode = NULL;
        }
        return true;
    }

    // 置最小值初值
    minVal = preNode->data;
    // 考虑多个节点的情形
    while(currNode)
    {
        if (currNode->data < minVal)
        {
            minVal = currNode->data;
            // 记录最小节点
            minNode = currNode;
            // 记录最小节点的前一个节点
            preMinNode = preNode;
        }
        
        preNode = preNode->next;
        currNode = preNode->next;
    }

    // 找到了最小的值节点
    preMinNode->next = minNode->next;
    delete minNode;
    minNode = NULL;
    return true;
}

4 楼

哇,好喜欢楼上的签名哦,不知是否愿意转让呀?o(∩_∩)o...哈哈

我来回复

您尚未登录,请登录后再回复。点此登录或注册