#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
using namespace std;
////////////////尾插法创建单链表
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList,LinkStrNode;
LNode *InitList(LNode *L){
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
LNode *CreatList_R(LNode *S)
{
LNode *p,*r;
r=S;//指向头结点
ElemType e;
int i=1;
while(i)
{
cin>>e; //输入元素值
if(e!='\n'){
p=(LNode*)malloc(sizeof(LNode*));
p->data=e;//将元素值赋给结点*p的数据域
p->next=NULL;
r->next=p;//将*p插入到尾结点r后
r=p;//r指向新的尾结点*p
}
else i=0;
}
return S;
}
void PrintList(LNode *L){
LNode *q=L->next;
while(q!=NULL){
cout<<q->data<<" ";
q=q->next;
}
cout<<endl;
}
int main(){
//输入L1
LNode *L1=InitList(L1);
cout<<"请输入L1:(请以'&'键结束)"<<endl;
L1=CreatList_R(L1);
cout<<"你输入的L1为:"<<endl;
PrintList(L1);
cout<<"\n"<<endl;
}
将第29行: cin>>e; 修改为: cin.get(e);
cin 输入 会忽略 空格和换行的,你还是 按照 & 作为结束吧
避免帧错误(帧的校验),避免帧丢失(超时重发),避免帧重复(帧有序号)
确认:接收方收到正确帧以后向发送方发肯定性确认,若收到的帧有问题则发否定性确认,此时发送方重发此帧
差错检测和校正:纠错码(海明码),检错码(校验和,块校验和码,循环冗余校验码CRC)
校验和:所有位数相加,算法简单,实现容易,检错率不高
块校验码:对每一个传输的单位数据进行异或操作,简单常用,单检错强度较弱
循环冗余检错码CRC:
数据帧丢失:通过发送方计时器解决,发送方一旦发送一帧,就启动计时器,在规定时间内,一般都应该收到回音,若计时器溢出时还未收到回音,则重发此帧
重复帧:若由于接收方丢失了确认帧而导致发送方多次重发同一帧,此时接收方能根据每一帧的帧编号区别重复帧
要实现一个单链表,并且允许用户通过逐个输入节点值来创建链表,可以按照以下步骤实现:
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* addNode(Node* head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if (head == NULL) {
// 如果链表为空,则将新节点设为头节点
head = newNode;
} else {
// 如果链表不为空,则找到链表的末尾再添加新节点
Node* current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
return head;
}
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
Node* head = NULL;
int value;
printf("请输入节点值(以回车作为结束标志):\n");
while (1) {
if (scanf("%d", &value) != 1) {
// 如果输入不是数字,则结束循环
break;
}
getchar(); // 清除输入缓冲区中的回车符
head = addNode(head, value);
}
printf("链表的值为:");
printList(head);
return 0;
}
这样,用户就可以通过逐个输入节点值来创建链表,以回车作为结束标志。之后可以调用printList函数来输出链表的值。
注意:以上代码是用C语言编写的,需要包含stdio.h和stdlib.h头文件来使用相关函数。