一道链表的排序操作,想了很久想不出来,求解答*#¥……%&!
仔细看题目中给出的《单链表的冒泡排序思想》,就差把伪代码都写给你了,你就一句一句的把中文翻译成c语言就行了,不用你想什么
你要是连语法都不会,那除了回去复习没有什么好办法
供参考:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void CreateList(LinkList* L)
{
int n , i;
LinkList pL, pT;
(*L) = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
pL = (*L);
scanf("%d", &n);
for (i = 0; i < n; i++)
{
pT = (LNode*)malloc(sizeof(LNode));
pT->next = NULL;
scanf("%d", &pT->data);
pL->next = pT;
pL = pT;
}
}
void print(LinkList L)
{
LinkList p = L;
while (p->next){
printf("%d ", p->next->data);
p = p->next;
}
printf("\n");
}
void BubbleSort(LinkList L)//对链表进行冒泡排序
{
LinkList pre, p,tail;
tail = NULL;
while (L->next != tail)
{
print(L); //每循环一次,输出链表的结点移动变化
pre = L; //当前结点的前一个结点
p = L->next; //当前结点
while (p->next!=tail)//当前结点的下一个结点
{
if (p->data > p->next->data)
{ //当前结点的值与下一个结点的值比较
pre->next = p->next;
p->next = pre->next->next;
pre->next->next = p;
}
else
p = p->next;
pre = pre->next;
}
tail = p;//当前指针赋值给尾指针
}
}
int main()
{
LinkList L = NULL;
CreateList(&L);
BubbleSort(L);
return 0;
}
非标准答案,仅供参考!谢谢!
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode
{
ElemType data;
struct Lnode *next;
} LNode, *LinkList;
void bubsort(LinkList head);
LinkList madeNode(ElemType data);
void insert(LinkList head, LinkList L);
int main()
{
// 初创建头结点
LNode *head = malloc(sizeof(LNode));
if (!head)
return -1;
int n, data;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &data);
// 创建结点
LNode *p = madeNode(data);
// 插入结点 尾部插入
insert(head, p);
}
fputc('\n', stdout);
// 原链表遍历输出
print(head);
fputc('\n', stdout);
// 排序以及分步输出
bubsort(head);
return 0;
}
// 输出链表
void print(LinkList head)
{
LinkList p = head->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
}
// 创建结点
LinkList madeNode(ElemType data)
{
LinkList tmp = malloc(sizeof(LNode));
if (!tmp)
return NULL;
tmp->data = data;
tmp->next = NULL;
return tmp;
}
// 插入结点 尾部插入
void insert(LNode * head, LNode * L)
{
LNode *p = head;
while (p->next)
{
p = p->next;
}
p->next = L;
}
// 冒泡排序以及分步输出
void bubsort(LinkList head)
{
if (!head)
return;
LinkList p1 = head, p2 = head, p0 = head;
while (p2->next)
{
p2 = p2->next;
}
int flag = 1, tmp;
for (; p1 != p2 && flag == 1; p1 = p1->next)
{
flag = 0;
for (p0 = head; p0 != p2 && p0->next != NULL; p0 = p0->next)
{
if ((p0->next)->data < p0->data)
{
tmp = (p0->next)->data;
(p0->next)->data = p0->data;
p0->data = tmp;
flag = 1;
}
}
if (flag == 0)
break;
else
{
print(head);
fputc('\n', stdout);
}
}
}