首页 > 编程语言 >编写C程序,实现单链表的下列功能: 1、从键盘输入一组数据,创建单链表; 2、输出单链表; 3、插入元素,给出插入成功或失败的信息; 4、删除元素,给出删除成功或失败的信息。

编写C程序,实现单链表的下列功能: 1、从键盘输入一组数据,创建单链表; 2、输出单链表; 3、插入元素,给出插入成功或失败的信息; 4、删除元素,给出删除成功或失败的信息。

时间:2022-11-12 11:25:02浏览次数:39  
标签:head 单链 LNode 删除 结点 next 插入 printf

编写C程序,实现单链表的下列功能:

1、 从键盘输入一组数据,创建单链表;

2、 输出单链表;

3、 插入元素,给出插入成功或失败的信息;

4、删除元素,给出删除成功或失败的信息。

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode {        //声明结构体用来描述单链表
    int data;                //单链表中结点的数据域
    struct LNode* next;        //单链表中结点的指针域
}LNode, * LinkList;

LNode* head;

void printStar()    //连续输入几十个*,用来设计虚拟界面的边框
{
    int i;
    for (i = 0; i < 70; i++)
        printf("*");
    printf("\n");
}

void menu()            //因为C语言无法创建可视化界面,因此这里创建一个虚拟的界面,方便用户操作
{
    printStar();
    printf("\t\t\t欢迎进入单链表操作界面!\n");
    printf("请从键盘输入数字,完成对应的操作(1到4为有效操作,输入其他退出程序)\n");
    printf("\t 1.创建单链表\n");
    printf("\t 2.打印单链表\n");
    printf("\t 3.插入结点\n");
    printf("\t 4.删除结点\n");
    printStar();
}

LNode* CreateHead() {    //单链表的初始化操作
    head = (LNode*)malloc(sizeof(LNode));
    head->next = NULL;
    return head;
}

LNode* CreateNext() {    //创建单链表(尾插法)
    LNode* p, * r;
    int temp;
    printf("创建单链表:\n");
    printf("输入的值为1到9之间的数,输入'0'结束\n");
    printf("请输入结点值: ");
    fflush(stdin);
    scanf_s("%d", &temp);
    r = head;
    while (temp != 0) {
        if ((0 < temp) && (temp < 10)) {
            p = (LinkList)malloc(sizeof(LNode));
            p->data = temp;
            p->next = NULL;
            r->next = p;
            r = p;
            printf("请输入结点值:");
            fflush(stdin);
            scanf_s("%d", &temp);
        }
        else {
            temp = 0;
            printf("输入错误,输入的值应为1到9之间的数\n");
        }
    }
    return head;
}

void OutPutLink() {        //打印单链表
    LNode* p;
    p = head;
    printf("打印单链表:\n");
    while (p->next != NULL) {
        p = p->next;
        printf("%d->", p->data);
    }
    printf("NULL");
    printf("\n");
}

void Insert(LNode* L) { //插入结点
    int i, e;
    printf("请输入插入位置:");
    fflush(stdin);
    scanf_s("%d", &i);
    printf("请输入数据:");
    fflush(stdin);
    scanf_s("%d", &e);
    int j = 0;
    LNode* p = L;
    while (p && (j < i - 1)) {
        p = p->next;
        j++;
    }
    if (!p || (j > i - 1))
        printf("插入失败\n");
    LNode* t = (LNode*)malloc(sizeof(LNode));
    t->data = e;
    t->next = p->next;
    p->next = t;
    printf("插入成功\n");
}

void  Delete(LNode* L) {  //删除结点
    int i;
    printf("请输入删除位置:");
    fflush(stdin);
    scanf_s("%d", &i);
    int j = 0;
    LNode* p = L;
    LNode* del = NULL;
    while ((p->next) && (j < i - 1)) {
        p = p->next;
        j++;
    }
    if (!(p->next) || (j > i - 1))
        printf("删除失败\n"); //增强程序的健壮性
    del = p->next;
    p->next = del->next;
    free(del);
    printf("删除成功\n");
}

int main() {
    int select, flag = 1;//flag意思是标记,用来表示用户是否选择了1-4操作,如果不是就将flag设置为0,表示用户不选择继续操作,也就是退出程序
    head = CreateHead();    //初始化单链表
    menu();
    while (flag == 1) {
        printf("您选择的操作是:");
        fflush(stdin);    //清除键盘缓冲区,不然无法连续读取用户刚刚从键盘输入的字符,因为可能读取的是缓冲区以前保存的字符
        scanf_s("%d", &select);
        switch (select) {    //根据用户的输入,调用前面写的子函数,完成单链表的3个功能
        case 1:    head = CreateNext();
            printf("\n");
            break;        //创建单链表
        case 2:    OutPutLink();
            printf("\n");
            break;        //打印单链表
        case 3:    Insert(head);
            printf("\n");
            break;        //插入结点
        case 4:    Delete(head);
            printf("\n");
            break;        //删除结点
        default:printf("您选择退出程序,欢迎下次光临!\n");
            flag = 0;
        }
    }
    printf("\n");
    system("pause");
    return 0;
}

标签:head,单链,LNode,删除,结点,next,插入,printf
From: https://www.cnblogs.com/smartlearn/p/16882973.html

相关文章

  • 删除DataFrame的某列或某行数据
    一、删除DataFrame的某列或某行数据drop方法的用法:drop(labels,axis=0,level=None,inplace=False,errors='raise')axis为0时表示删除行,axis为1时表示删除列删除某列......
  • 插入MySQL报错‘pymysql.err.DataError: (1406, "Data too long for column 'url' at
    错误重现:插入MySQL报错‘pymysql.err.DataError:(1406,"Datatoolongforcolumn'url'atrow1")’解决方法:在插入MySQL的字符太多,此时将MySQL的模式改为非严格模......
  • linux所有命令都无法使用,rm -f * 删除根目录
    【1】故障情况(1.1)误删文件在根目录下,有2个文件,node_exporter和node_exporter_start.sh我想把这2个文件都删掉,小心,生产环境 rm-fnode*要命了,多打了......
  • SQL Server 表中删除重复行
    前言   MySQL去重例子​​https://blog.51cto.com/fengyuzaitu/2687655​​​​​​​https://blog.51cto.com/fengyuzaitu/5790968​​select id,name,age from u......
  • php实现单链表
    今天记录下使用php实现单向链表的功能操作先创建一个节点类用来生成节点对象<?phpclassnode{public$name=null;public$no=null;public$next=......
  • 浏览器删除https证书缓存方法
    参考:https://www.jianshu.com/p/44f6ef7d51c0当访问了一个http的url网址时,经常会遇到被强行重定向到了https的相对网址上,这是因为这个域名在浏览器中已经缓存了证书,每次......
  • Android实战简易教程-第二十枪(GridView长按显示删除)
    用过UC浏览器的都使用过如下功能:长按图标会弹出删除的图标,我们下面研究一下如何实现类似效果。1.配置main.xml文件:<RelativeLayoutxmlns:android="http://schemas.android.......
  • 快速批量删除 Salesforce ApexLogs 或者其他对象
    实际开发中,有时候ApexLog会超出限制,系统就会提示,由于Salesforce不支持下面这种方式delete[SELECTIdFROMApexLog];这时如果想删除这些数据,有两种界面化方式:在......
  • 35. 搜索插入位置
    35.搜索插入位置classSolution{publicintsearchInsert(int[]nums,inttarget){intl=0,r=nums.length-1;while(l<r){......
  • 页面中插入百度地图(利用百度地图API)
    .aspx代码如下:<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="插入地图.aspx.cs"Inherits="插入地图"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Trans......