题目:找出单链表中的最小值,把该节点插入到第一个节点位置
思想:
先进行查找操作,注意保存前驱结点指针(通过该这个才能寻找到最小元素的结点),然后进行简单的交换操作,这里注意考虑最小值结点的所在位置,头和尾要分开来考虑。
代码展示:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode,*LinkList;
void InitLInkList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LinkNode));
L->next = NULL;
}
void Insert(LinkList &L,int x)
{
LinkList p;
p = (LinkList)malloc(sizeof(LinkNode));
p->data = x;
p->next = L->next;
L->next = p;
}
void Print(LinkList L)
{
while(L->next!=NULL)
{
printf("%d ",L->next->data);
L = L->next;
}
}
int Dispose(LinkList &L)
{
LinkList p = L->next;
LinkList r;
int i = 0;
if(p->next==NULL)
{
return 0;
}
int Min = p->data;
while(p->next!=NULL)
{
if(p->next->data<Min)
{
Min = p->next->data;
r = p;
i++;
}
p = p->next;
}
if(i==0)
{
return 0;
}
if(r->next!=NULL)
{
LinkList q = r->next;
r->next = r->next->next;
q->next = L->next;
L->next = q;
}
else
{
LinkList q = r->next;
r->next = NULL;
q->next = L->next;
L->next = q;
}
return 0;
}
int main() {
int n;
int e;
LinkList L;
InitLInkList(L);
printf("请输入要存放的数据个数:\n");
scanf("%d",&n);
printf("请输入要存放的数据:\n");
for(int i=0; i<n; i++)
{
scanf("%d",&e);
Insert(L,e);
}
printf("目前表中元素:");
Print(L);
printf("\n");
Dispose(L);
printf("调整后:");
Print(L);
return 0;
}