单链表输入链式串时怎么以回车作为结束标志


#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 输入 会忽略 空格和换行的,你还是 按照 & 作为结束吧

img

img

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7626354
  • 你也可以参考下这篇文章:字符串和字符串结束标志
  • 除此之外, 这篇博客: 【计算机网络】考试复习┭┮﹏┭┮中的 差错控制: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 避免帧错误(帧的校验),避免帧丢失(超时重发),避免帧重复(帧有序号)

    • 确认:接收方收到正确帧以后向发送方发肯定性确认,若收到的帧有问题则发否定性确认,此时发送方重发此帧

      差错检测和校正:纠错码(海明码),检错码(校验和,块校验和码,循环冗余校验码CRC)

      • 校验和:所有位数相加,算法简单,实现容易,检错率不高

      • 块校验码:对每一个传输的单位数据进行异或操作,简单常用,单检错强度较弱

      • 循环冗余检错码CRC:

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    • 数据帧丢失:通过发送方计时器解决,发送方一旦发送一帧,就启动计时器,在规定时间内,一般都应该收到回音,若计时器溢出时还未收到回音,则重发此帧

    • 重复帧:若由于接收方丢失了确认帧而导致发送方多次重发同一帧,此时接收方能根据每一帧的帧编号区别重复帧

  • 您还可以看一下 千锋老师的老罗零基础鸿蒙应用开发教程课程中的 鸿蒙的发展史小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    要实现一个单链表,并且允许用户通过逐个输入节点值来创建链表,可以按照以下步骤实现:

    1. 创建一个节点结构体,包含两个成员变量:数据值和指向下一个节点的指针。
    typedef struct Node {
        int data;
        struct Node* next;
    } Node;
    
    1. 创建一个函数来添加节点到链表中,每次添加新节点时需要进行以下操作:
    2. 创建新节点,并赋值为用户输入的值;
    3. 将新节点连接到链表的末尾,即将前一个节点的指针指向新节点。
    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;
    }
    
    1. 创建一个函数来遍历链表并输出节点的值,可以用于验证链表的创建结果。
    void printList(Node* head) {
        Node* current = head;
        while (current != NULL) {
            printf("%d ", current->data);
            current = current->next;
        }
        printf("\n");
    }
    
    1. 在主函数中,使用一个循环来接收用户不断输入的节点值,并调用添加节点的函数来创建链表。使用回车作为结束标志。
    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头文件来使用相关函数。