断点如下:
全部代码:
#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;
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;
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;
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;
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;
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;
}