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