有序单链表:随机输入n个单字符【无序的】,输出升序的结果
单向链表,实现'b'--'h'字符的逆置
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
union
{
int len;
char data;
};
struct node *next;
}*Linklist,Node;
Linklist create();
void insertRear(Linklist L,char e);
void show(Linklist L);
void sort(Linklist L);
void rev(Linklist L);
void freeLinklist(Linklist L);
#endif
main.c
#include "head.h"
#define N 5
int main(int argc, const char *argv[])
{
Linklist L=create();
if(!L)
return -1;
char e;
int n;
puts("---insertRear---");
printf("n:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf(" %c",&e);
insertRear(L,e);
}
puts("---show---");
show(L);
puts("---sort---");
sort(L);
show(L);
puts("---rev---");
rev(L);
show(L);
freeLinklist(L);
return 0;
}
func.c
#include "head.h"
Linklist createNode()
{
Linklist p=(Linklist)malloc(sizeof(Node));
if(!p)
return NULL;
p->next=NULL;
}
Linklist create()
{
Linklist L=createNode();
if(!L)
return NULL;
L->len=0;
return L;
}
void show(Linklist L)
{
Linklist p=L;
while(L->next)
{
L=L->next;
printf("%c ",L->data);
}
puts("");
}
Linklist _findRear(Linklist L)
{
while(L->next)
L=L->next;
return L;
}
void insertRear(Linklist L,char e)
{
Linklist p=createNode();
if(!p)
return;
Linklist q=_findRear(L);
p->data=e;
q->next=p;
L->len++;
}
void deleteHead(Linklist L)
{
if(!L->len)
return;
Linklist p=L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
}
void rev(Linklist L)
{
Linklist p=L->next;
Linklist t=p;
L->next=NULL;
while(p)
{
p=p->next;
t->next=L->next;
L->next=t;
t=p;
}
}
void sort(Linklist L)
{
Linklist p=L->next;
L->next=NULL;
while(p)
{
Linklist t=p;
p=p->next;
Linklist q=L;
while(q->next && q->next->data-t->data<0)
{
q=q->next;
}
t->next=q->next;
q->next=t;
}
}
void freeLinklist(Linklist L)
{
if(!L)
return;
for (int i=0; i<L->len; i++)
{
deleteHead(L);
}
free(L);
L=NULL;
}