已知线性链表第一个结点的指针为list,写一个创建链表算法、打印输出链表的算法、将该链表中数据域值最小的那个点移到链表的最前端的算法,写出完整的程序。
#include<stdio.h>
#include <stdlib.h>
typedef struct node {
int a;
struct node* link;
}Lnode, * linklist;
linklist Creat(int n) {//创建链表,返回头节点
linklist p,r=NULL,list = NULL;
int a;
int i;
printf("请输入数据:\n");
for (i = 0; i < n; i++) {
scanf("%d", &a);
p = (linklist)malloc(sizeof(Lnode));
p->a = a;
p->link = NULL;
if (list == NULL)
list = p;
else
r->link = p;
r = p;
}
return(list);
}
void traverse(linklist list) {//遍历
linklist p;
p = list;
while (p != NULL) {
printf("%d ", p->a);
p = p->link;
}
}
linklist seek(linklist li) {//查找最小值,返回指针
linklist p = li, minp;
minp = p;
p = li->link;
while (p != NULL) {
if (minp->a > p->a)
minp = p;
p = p->link;
}
return(minp);
}
linklist insert(linklist minp, linklist list) {//将最小值移动到最前面
linklist p = list;
if (minp == list)//判断最小值是否在第一位
return(list);
else {
if (minp->link == NULL) {//判断最小值是否在最后一位
while (p->link != minp) {
p = p->link;
}
p->link = NULL;
minp->link = list;
list = minp;
}
else {
while (p->link != minp) {
p = p->link;
}
p->link = minp->link;
minp->link = list;
list = minp;
}
return(list);
}
}
int main() {
printf("请输入链表长度:");
int sum;
linklist li;
scanf("%d", &sum);//输入链表长度
li = Creat(sum);//创建链表
traverse(insert(seek(li), li));//遍历处理过后的链表
}