1、有序单链表;
随机输入n个无序的单字符,输出升序的结果,
例如;输入;dahkew
输出;adehkw
程序代码
main.c
#include"head.h"
int main(int argc, const char *argv[])
{
//申请单链链表头
Linklist L=CreateHead();
//判断是否申请成功
if(L==NULL)
return 0;
int n;
printf("请输入要排序的单字符的个数:");
scanf("%d",&n);
char key;
for(int i=0;i<n;i++)
{
printf("请输入字符:");
getchar();
scanf("%c",&key);
LinklistSort(L,key);
}
//链表遍历
LinklistShow(L);
//利用函数释放链表空间
LinklistFree(L);
free(L);
L=NULL;
return 0;
}
test.c
#include"head.h"
Linklist CreateHead()
{
Linklist p=(Linklist)malloc(sizeof(Node));
//判断是否申请成功
if(p==NULL)
{
printf("申请失败\n");
return NULL;
}
p->len=0;
p->next=NULL;
return p;
}
//创建普通节点
Linklist CreateRear()
{
Linklist p=(Linklist)malloc(sizeof(Node));
//判断是否申请成功
if(p==NULL)
{
printf("普通节点申请失败\n");
return NULL;
}
//初始化
p->data=0;
p->next=NULL;
return p;
}
//链表排序
void LinklistSort(Linklist L,char key)
{
//调用函数创建普通节点
Linklist q=CreateRear();
if(q==NULL)
return;
q->data=key;//赋值
Linklist p=L;
while(p->next!=NULL&&p->next->data<q->data)
{
p=p->next;
}
q->next=p->next;
p->next=q;
L->len++;
}
//链表遍历
void LinklistShow(Linklist L)
{
while(L->next)
{
L=L->next;
printf("%c\t",L->data);
}
}
void LinklistFree(Linklist L)
{
if(L==NULL)
return;
for(Linklist p=L->next;p!=NULL;)
{
L->next=p->next;
free(p);
p=L->next;
}
}
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datatype;
typedef struct node
{
union{
int len;
datatype data;
};
struct node *next;
}*Linklist,Node;
void LinklistFree(Linklist L);
void LinklistShow(Linklist L);
void LinklistSort(Linklist L,char key);
Linklist CreateRear();
Linklist CreateHead();
#endif
输出结果
请输入要排序的单字符的个数:6
请输入字符:d
请输入字符:a
请输入字符:h
请输入字符:k
请输入字符:e
请输入字符:w
a d e h k w
2.单项链表,实现'b'-'h'字符的逆置
函数
void nizhi(Linklist L)
{
if(L==NULL||L->len==1)
return;
Linklist q=L->next;
L->next=NULL;
while(q)
{
Linklist t=q;
q=q->next;
t->next=L->next;
L->next=t;
}
}
运行结果
请输入要排序的单字符的个数:6
请输入字符:a
请输入字符:b
请输入字符:c
请输入字符:d
请输入字符:e
请输入字符:f
a b c d e f f e d c b a