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