题目要求:
我的代码实现:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//尾插法(有头结点)
LinkList List_HeadInsert(LinkList &L)
{
ElemType x;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
LNode *r=L,*s;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=NULL;
r->next=s;
r=s;
scanf("%d",&x);
}
return L;
}
//本题的解答:
void FindMinDelete(LinkList &L,ElemType &e)
{
LNode* p=L->next;
ElemType min=L->next->data;
while(p) //确定最小值
{
if(min>p->data)min=p->data;
p=p->next;
}
for(p=L;p->next;p=p->next) //找到最小值的前一个结点
{
if(p->next->data==min)break;
}
LNode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return;
}
//................................
//彻底销毁整个链表
void DestroyList(LinkList &L)
{
LNode *p=L->next,*q;
while(p)
{
q=p;
p=p->next;
free(q);
}
free(L);
return;
}
int main()
{
ElemType e;
LinkList L;
printf("\n构造带头结点的单链表L:\n");
L=List_HeadInsert(L);
FindMinDelete(L,e);
printf("最小值结点元素为: %d\n",e);
DestroyList(L);
return 0;
}
参考王道的算法思想再实现一次,这个算法效率更高:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//尾插法(有头结点)
LinkList List_HeadInsert(LinkList &L)
{
ElemType x;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
LNode *r=L,*s;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=NULL;
r->next=s;
r=s;
scanf("%d",&x);
}
return L;
}
//本题的解答:
void FindMinDelete(LinkList &L,ElemType &e)
{
LNode *minp=L->next,*minpre=L;
while(minpre->next)
{
if(minpre->next->data<minp->data)minp=minpre->next;
minpre=minpre->next;
}
minpre->next=minp->next;
e=minp->data;
free(minp);
return;
}
//................................
//彻底销毁整个链表
void DestroyList(LinkList &L)
{
LNode *p=L->next,*q;
while(p)
{
q=p;
p=p->next;
free(q);
}
free(L);
return;
}
int main()
{
ElemType e;
LinkList L;
printf("\n构造带头结点的单链表L:\n");
L=List_HeadInsert(L);
FindMinDelete(L,e);
printf("最小值结点元素为: %d\n",e);
DestroyList(L);
return 0;
}