单链表的基本操作(c语言)——章节实验作业

Posted BEI_TIAN_XUAN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表的基本操作(c语言)——章节实验作业相关的知识,希望对你有一定的参考价值。

单链表的基本操作(c语言)——章节实验作业

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<stdbool.h>
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node* next;
}Node, *LinkList;
void Show_meau()   //菜单
{
    printf("**********************************\\n");
    printf("            WELCOME!\\n");
    printf("\\n");
    printf("\\t单链表的基本操作\\n\\n");
    printf("  \\t 1.查询\\t 2.插入\\n\\n");
    printf("  \\t 3.删除\\t 4.打印\\n\\n");
    printf("  \\t 5.计数\\t 6.销毁\\n\\n");
    printf("  \\t 7.退出\\t 8.建表\\n\\n");
    printf("\\n");
    printf("     输入相关序号实现相关功能!\\n");
    printf("**********************************\\n");
}
void InitList(LinkList *L)
{
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
}
void Create_List(LinkList L)   //尾插法
{
    ElemType c;
    Node* r, * s;
    bool flag=true;
    r = L;
    printf("提示:输入$表示建表结束!\\n");
    while (flag==true)
    {
        c = getchar();
        if (c != \'$\')
        {
            s = (LinkList*)malloc(sizeof(Node));
            s->data = c;
            r->next = s;
            r = s;
        }
        else
        {
            flag = false;
            r->next = NULL;
        }
    }
    printf("建表完成!\\a");
    Sleep(2000);
}
void Search(LinkList L)
{
    int flag=1;
    Node* p;
    ElemType e;
    getchar();   //吸收换行符
    p = L->next;
    printf("请输入要查找的值:");
    e = getchar();
    while (p != NULL)
    {
        if (p->data != e)
            p = p->next;
        else
        {
            printf("该地址为:%p\\n", p);
            printf("输入0退出!\\n");
            scanf("%d", &flag);
            break;
        }
    }
    if (flag == 0)
        return;
    printf("查无此值!\\a");
    Sleep(2000);
}
void DispList(LinkList L)
{
    int n;
    LinkList p = L->next;
    if (p == NULL)
    {
        printf("表为空!\\a");
        Sleep(2000);
        return;
    }
    printf("打印值为:\\n");
    while (p != NULL)
    {
        printf("%c", p->data);
        p = p->next;
    }
    printf("\\n\\n");
    while (1) {
        printf("输入0退出打印!\\n");
        scanf("%d", &n);
        if (n == 0)
            return;
        else
            printf("输入无效,请重新输入!\\n");
    }
}
int ListLength(LinkList *L)
{
    int n = 0;
    LinkList p = L;
    if (p->next == NULL)
    {
        printf("表为空!\\a\\n");
        Sleep(2000);
        return;
    }
    while (p->next != NULL)
    {
        n++;
        p=p->next;
    }
    n--;
    return n;
}
void Print_Length(LinkList L)
{
    int n = 1;
        while (1)
        {
            if (n == 1)
            {
                printf("表长为:%d\\n", ListLength(L));
                printf("输入0退出打印!\\n");
                scanf("%d", &n);
            }
            if (n == 0)
                return;
        }
}
void ListInsert(LinkList L)
{
    int i,j=0;
    ElemType e;
    LinkList p = L,  s;
    if (p->next == NULL)
    {
        printf("表为空!\\a\\n");
        Sleep(2000);
        return;
    }
    printf("当前表长为:%d\\n", ListLength(L));  //注意指针L
    while (1)
    {
        printf("请输入插入的位置:");
        scanf("%d", &i);
        if (i <= 0 || i > ListLength(L))
        {
            printf("输入错误!请重新输入!\\n");
        }
        else
            break;
    }
    getchar();
    printf("请输入插入的值:");
    scanf("%c", &e);
    while (j < i  && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
    {
        printf("查无此值!\\n");
        Sleep(2000);
        return;
    }
    else
    {
        s = (LinkList*)malloc(sizeof(Node));
        s->data = e;
        s->next = p->next;
        p->next = s;
        printf("插入成功!\\a");
        Sleep(2000);
    }
}
void ListDelete(LinkList L)
{
    int i, j = 0;
    ElemType e;
    LinkList p = L,  q;
    if (p->next == NULL)
    {
        printf("表为空!\\a\\n");
        Sleep(2000);
        return;
    }
    printf("当前表长为:%d\\n", ListLength(L));  //注意指针L
    while (1)
    {
        printf("请输入删除值的位置:");
        scanf("%d", &i);
        if (i <= 0 || i > ListLength(L))
        {
            printf("输入错误!请重新输入!\\n");
        }
        else
            break;
    }
    getchar();
    while (j < i && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
    {
        printf("查无此值!\\n");
        Sleep(2000);
        return;
    }
    else
    {
        q = p->next;
        if (p == NULL)
        {
            printf("查无此值!\\n");
            Sleep(2000);
            return;
        }
        e = q->data;
        p->next = q->next;
        free(q);
        printf("删除成功!\\a");
        Sleep(2000);
    }
}
void DestroyList(LinkList L)
{
    LinkList pre = L,  p = L->next;
    while (p != NULL)   //逐一释放
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
    printf("销毁成功!\\a");
    Sleep(2000);
}
int main()
{
    int n;
    LinkList L;     //头结点应为指针,因为调用DestroyList(L)时由手动释放(free())
    InitList(&L);   //注意栈区(自动释放)和堆区(手动释放)的销毁区别
    while (1) {
        system("cls");    //清屏函数
        Show_meau();
        printf("请输入1-8的数:");
        scanf("%d", &n);
        switch (n) {
        case 1:
            Search(L);
            break;
        case 2:
            ListInsert(L);
            break;
        case 3:
            ListDelete(L);
            break;
        case 4:
            DispList(L);
            break;
        case 5:
            Print_Length(L);
            break;
        case 6:
            DestroyList(L);    //注意栈和堆的销毁的区别
            break;
        case 7:
            printf("........正在退出中........");
            Sleep(3000);
            system("cls");
            printf("\\a退出成功!"),
                exit(0);
            break;
        case 8:
            Create_List(L);
            break;
        default:
            printf("\\a输入错误!请重新输入(1—8)!"),
                Sleep(2000);
            break;
        }
    }
    return 0;
}

以上是关于单链表的基本操作(c语言)——章节实验作业的主要内容,如果未能解决你的问题,请参考以下文章

学生信息管理系统(c语言简版)——章节实验作业

单链表的基本操作操作,类C语言

数据结构--单链表的c语言实现(超详细注释/实验报告)

数据结构代码(用C语言) 单链表的插入和删除

C语言单链表合并

C语言用C语言实现单链表的所有操作