编写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;
}

posted on 2022-11-12 11:12  wshidaboss  阅读(231)  评论(0编辑  收藏  举报