主题:[讨论]一个搞不掂的程序!
这个程序弄了很久,但老是不能如我所意~
#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给删除掉了,请教一个高手,如何修改才能正确删除最小的值~~~
#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给删除掉了,请教一个高手,如何修改才能正确删除最小的值~~~