单链表的基本操作(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语言)——章节实验作业的主要内容,如果未能解决你的问题,请参考以下文章