关于c:单链表的基本操作c语言章节实验作业

7次阅读

共计 3355 个字符,预计需要花费 9 分钟才能阅读完成。

单链表的基本操作(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;
}
正文完
 0