RLE压缩和解压算法以及链表翻转
2012-01-14 21:11
603 查看
#include <stdio.h>
#include <stdlib.h>
struct RleNode
{
int count;
char ch;
struct RleNode * next;
};
//压缩字符串
struct RleNode* encode(char *str)
{
char *ptr = str;
int num = 1;
int i = 0;
struct RleNode* head, *p, *q;
head = (struct RleNode*)malloc(sizeof(struct RleNode));
head->next = NULL;
p = head;
while(*ptr != '\0')
{
char ch = *ptr;
char ch2 = ptr[i];
char ch3 = ptr[i + 1];
if(ptr[i] == ptr[i + 1])
{
num++;
}
if((ptr[i] != ptr[i + 1]) )
{
q = (struct RleNode*)malloc(sizeof(struct RleNode));
q->count = num;
q->ch = ptr[i];
q->next = NULL;
p->next = q;
p = q;
num = 1;
}
ptr++;
}
return head;
}
//解压字符串
char *decode(struct RleNode* head)
{
char *str = calloc(1,100);
int num = 0;
int i = 0;
struct RleNode* p= head->next;
if(p == NULL)
{
printf("空表");
}
else
{
while(p->next != NULL)
{
num = p->count;
while(num > 0)
{
str[i] = p->ch;
i++;
num--;
}
p = p->next;
}
num = p->count;
while(num > 0)
{
str[i++] = p->ch;
num--;
}
}
return str;
}
//链表反转
struct RleNode* reverse(struct RleNode* head)
{
struct RleNode *prev = NULL, *current = NULL, *p = head->next;
if(p == NULL)
{
printf("空表");
}
while(p != NULL)
{
prev = current;
current = p;
p = p->next;
current->next = prev;
}
head->next = current;
return head;
}
//显示链表
void disp(struct RleNode* head)
{
struct RleNode* p= head->next;
if(p == NULL)
{
printf("空链表");
}
else
{
while(p->next != NULL)
{
printf("%d%c", p->count, p->ch);
p = p->next;
}
printf("%d%c\n", p->count, p->ch);
}
}
int main()
{
struct RleNode* head = (struct RleNode*)malloc(sizeof(struct RleNode));
char *str = "aaaaahhhhhhmmmmmmmuiiiiiiiaaaaaa";
printf("源字符串:%s\n",str);
head = encode(str);
printf("压缩后为:");
disp(head);
head = reverse(head);
printf("反转后:");
disp(head);
printf("解压后为:%s",decode(head));
return 0;
}
#include <stdlib.h>
struct RleNode
{
int count;
char ch;
struct RleNode * next;
};
//压缩字符串
struct RleNode* encode(char *str)
{
char *ptr = str;
int num = 1;
int i = 0;
struct RleNode* head, *p, *q;
head = (struct RleNode*)malloc(sizeof(struct RleNode));
head->next = NULL;
p = head;
while(*ptr != '\0')
{
char ch = *ptr;
char ch2 = ptr[i];
char ch3 = ptr[i + 1];
if(ptr[i] == ptr[i + 1])
{
num++;
}
if((ptr[i] != ptr[i + 1]) )
{
q = (struct RleNode*)malloc(sizeof(struct RleNode));
q->count = num;
q->ch = ptr[i];
q->next = NULL;
p->next = q;
p = q;
num = 1;
}
ptr++;
}
return head;
}
//解压字符串
char *decode(struct RleNode* head)
{
char *str = calloc(1,100);
int num = 0;
int i = 0;
struct RleNode* p= head->next;
if(p == NULL)
{
printf("空表");
}
else
{
while(p->next != NULL)
{
num = p->count;
while(num > 0)
{
str[i] = p->ch;
i++;
num--;
}
p = p->next;
}
num = p->count;
while(num > 0)
{
str[i++] = p->ch;
num--;
}
}
return str;
}
//链表反转
struct RleNode* reverse(struct RleNode* head)
{
struct RleNode *prev = NULL, *current = NULL, *p = head->next;
if(p == NULL)
{
printf("空表");
}
while(p != NULL)
{
prev = current;
current = p;
p = p->next;
current->next = prev;
}
head->next = current;
return head;
}
//显示链表
void disp(struct RleNode* head)
{
struct RleNode* p= head->next;
if(p == NULL)
{
printf("空链表");
}
else
{
while(p->next != NULL)
{
printf("%d%c", p->count, p->ch);
p = p->next;
}
printf("%d%c\n", p->count, p->ch);
}
}
int main()
{
struct RleNode* head = (struct RleNode*)malloc(sizeof(struct RleNode));
char *str = "aaaaahhhhhhmmmmmmmuiiiiiiiaaaaaa";
printf("源字符串:%s\n",str);
head = encode(str);
printf("压缩后为:");
disp(head);
head = reverse(head);
printf("反转后:");
disp(head);
printf("解压后为:%s",decode(head));
return 0;
}
相关文章推荐
- 32bitTGA的rle压缩以及解压算法(二)
- 32bitTGA的rle压缩以及解压算法(一)
- 压缩解压目录和文件--ICSharpCode.SharpZipLib.dll 算法 (转)
- 【算法之链表(三)】单链表中,在仅允许使用一个指针的情况下,在指定的节点前面插入以及删除一个节点
- 算法系列之八:RLE行程长度压缩算法 .
- iOS开发中的压缩以及解压
- 地图经纬度C#和Javascript的压缩以及解压
- 数据结构 求链表的长度以及用冒泡排序的算法对链表中的值进行排序
- ZIP压缩算法详细分析及解压实例解释
- ZIP压缩算法详细分析及解压实例解释
- 在 Java 项目中解压7Zip特殊压缩算法文件
- 关于几种压缩算法以及hadoop和hbase中的压缩配置说明
- Linux常用命令之四:添加用户以及压缩解压
- RLE行程长度压缩算法
- 链表的创建以及翻转操作
- ZIP压缩算法详细分析及解压实例解释
- Hadoop压缩算法不支持自定义的压缩和解压接口
- linux 下面压缩,解压.rar文件以及rar,unrar实例
- linux 解压以及压缩命令
- python解压,压缩,以及存数据库的相关操作