1、有序单链表:
随机输入n个单字符【无序的】,输出升序的结果
例如:输入dahkew
输出adehkw
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
/*在堆区申请空间*/
Linklist L=LinklistCreate();
if(L==NULL)
return -1;
/*尾插*/
//把新节点存在最后一个节点后面
datatype e;
int n;
printf("请输入插入字符的数量:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf(" %c",&e);
getchar();
InsertRear(L,e);
}
printf("输入:\n");
LinklistShow(L);
ChooseSort(L);
printf("输出:\n");
LinklistShow(L);
//空间释放
L=LinklistFree(L);
return 0;
}
text.c
#include "head.h"
//在堆区申请空间
Linklist LinklistCreate()
{
Linklist L=(Linklist)malloc(sizeof(Node));
if(L==NULL)
return NULL;
L->len=0;
L->next=NULL;
return L;
}
//创建普通节点
Linklist LinklistCreateNode()
{
Linklist p=(Linklist)malloc(sizeof(Node));
if(p==NULL)
return NULL;
//创建成功
p->data=0;//表示创建新节点的数据域清0
p->next=NULL;//表示创建新节点指针为空
return p;
}
void DeleteHead(Linklist L)
{
//1.判断链表是否为空
if(L==NULL)
return;
//2.删除
Linklist p=L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
}
//链表尾插
void InsertRear(Linklist L,datatype e)
{
//先创建一个新节点
Linklist p=LinklistCreateNode();
if(p==NULL)
return;
//找到最后一个节点
Linklist q=L;
while(q->next!=NULL)
{
q=q->next;
}
//把新节点插入到最后一个节点的后面
p->data =e;
q->next=p;
L->len++;
}
//链表遍历
void LinklistShow(Linklist L)
{
Linklist p=L;
for(int i=0;i<L->len;i++)
{
p=p->next;
printf("%c\t",p->data);
}
putchar(10);
}
//获取最小元素
Linklist Min(Linklist L)
{
Linklist min;
min=L;
while(L->next)
{
if(min->data>L->next->data)
{
min=L->next;
}
L=L->next;
}
return min;
}
void ChooseSort(Linklist L)
{
Linklist p;
Linklist q;
p=L->next;
char temp;
for(;p->next!=NULL;p=p->next)
{
q=Min(p);
if(q!=p)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
}
//链表释放空间
Linklist LinklistFree(Linklist L)
{
if(L==NULL)
return NULL;
for(int i=0;i<L->len;i++)
{
DeleteHead(L);
}
free(L);
return L;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//链表定义
typedef char datatype;
typedef struct node
{
//数据域
union
{
int len;
datatype data;
};
//指针域
struct node *next;
}*Linklist,Node;
Linklist LinklistCreate();
Linklist LinklistCreateNode();
void LinklistShow(Linklist L);
void InsertRear(Linklist L,datatype e);
Linklist Min(Linklist L);
void ChooseSort(Linklist L);
Linklist LinklistFree(Linklist L);
#endif
结果:
2、单向链表实现“b”—“h”的逆置
//逆置
void LinklistRev(Linklist L)
{
Linklist p=L->next;//使用p节点保存第一个节点
L->next=NULL;//把头节点孤立
while(p)
{
Linklist t=p;//使用t保存p的第一个节点
p=p->next;//p向后移动
//把t头插在L头结点的后面
t->next=L->next;
L->next=t;
}
}
结果: