共计 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;
}
正文完