#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
typedef struct cNode{ //定义一个结构体
char byData; //节点存储的数据
struct cNode* pNext;//指针:指向下一个节点
struct cNode* pLast;//指针:指向前一个节点
}cNode;
cNode* fnCreat(cNode* pListHead) //建立一个链表
{
cNode *pNewNode, *pListNode; //声明链表的指针,分别是新建的节点指针、当前节点指针、链表表头指针;
char byInputNodeData;//声明一个字符变量,用于暂时存储节点数据的输入;
fflush(stdin);//情空键盘缓冲区数据;
scanf("%c", &byInputNodeData);
while(byInputNodeData != '\n')//如果输入字符不是“回车/换行符”则创建一个新节点并存储该输入,然后将节点加入到链表的尾部
{
if(byInputNodeData == '0'|byInputNodeData == '1')
{
pNewNode = (cNode*)malloc(sizeof(cNode));//创建新节点
pNewNode->byData = byInputNodeData;
pNewNode->pNext = NULL;
pNewNode->pLast = NULL;
if(pListHead == NULL)//如果链表为空链表则建立第一个节点;
{
pListHead = pNewNode;
pListNode = pListHead;
}
else//如果不是空链表则在后续加入新节点;
{
pListNode->pNext = pNewNode;
pNewNode->pLast = pListNode;
pListNode = pNewNode;
};
};
scanf("%c", &byInputNodeData);//继续读入下一个字节数据,每次仅读取一个自己,剩余字节将会暂存在键盘的输入缓冲区。
}
return(pListHead);//返回链表表头指针;
}
cNode* fnReceive(cNode* pListHead) //接收的0/1比特序列,即由链表pListHead模拟的串行数据;
//HDLC的串行输入数据处理,即每5位连1后面如果有一个0则把它去掉;
{
cNode *pChange, *pListNode = pListHead;
int nCount = 0;
while(pListNode != NULL)
{
if(pListNode->byData == '1' && nCount < 5)
{
nCount ++;
pListNode = pListNode->pNext ;
}
else
{
if(pListNode->byData == '0'&& nCount < 5)
{
nCount = 0;
pListNode = pListNode->pNext;
}
if(pListNode->byData == '0' &&nCount == 5)
{
nCount = 0;
pChange = pListNode->pLast;
pChange->pNext = pListNode->pNext;
pChange = pListNode->pNext;
pChange->pLast = pListNode->pLast;
pChange = pListNode;
pListNode = pChange->pNext ;
free(pChange);
}
else
return (pListHead);
}
}
return(pListHead);
}
cNode* fnSend(cNode* pListHead) //发送的0/1比特序列,即由链表pListHead模拟的串行数据;HDLC的串行输出数据处理,即每5位连1后面加一个0;
{
cNode *pChange,*pNewNode, *pListNode = pListHead;
int nCount = 0;
while(pListNode->pNext != NULL)
{
if(pListNode->byData == '1' && nCount < 5)
{
nCount ++;
pListNode = pListNode->pNext ;
}
else
{
if(pListNode->byData == '0')
{
nCount = 0;
pListNode = pListNode->pNext ;
}
else if(pListNode->byData == '1' &&nCount == 5)
{
nCount = 0;
pNewNode = (cNode*)malloc(sizeof(cNode));
pNewNode->byData = '0';
pNewNode->pNext = pListNode;
pNewNode->pLast = pListNode->pLast;
pChange = pNewNode->pLast;
pChange->pNext = pNewNode;
pListNode->pLast = pNewNode;
}
}
}
return(pListHead);
}
void fnOutput(cNode* pListHead) //输出经处理后的串行数据,即输入处理后的pListHead的内容
{
cNode *pListNode;
pListNode = pListHead;
while(pListNode != NULL)
{
printf("%c", pListNode->byData);
pListNode = pListNode->pNext;
};
printf("\n");
}
void main()
{
cNode* pListHead =NULL;
printf("输入0或1字符串:");//创建一个串行数据,用来模拟HDLC的串行数据内容。
pListHead = fnCreat(pListHead);
printf("发送的0或1字符串为:");//输出经HDLC的输出处理后的串行输出数据,即每5位连1后面加一个0;
pListHead = fnSend(pListHead);
fnOutput(pListHead);
printf("接收的0或1字符串为:");//输出经HDLC的输出处理后的串行输入数据,即每5位连1后面如果有一个0则把它去掉;
pListHead = fnReceive(pListHead);
fnOutput(pListHead);
system("pause");//按任意键结束
}
- 1
- 2
- 3
- 4
- 5
- 6
前往页