最近复习数据结构的时候写的一个关于单链表的查询和删除并且做成菜单的形式后期还会有其他数据结构的内容。
#include<stdio.h>
#include<windows.h>
#include<malloc.h>
#define MAXSIZE 1024
typedef struct Node
{
int num;
struct Node *next;
}LinkNode,*Linklist;
/*
*************初始化空链表*************
*/
Linklist InitLinklist()
{
Linklist L=(Linklist)malloc(sizeof(LinkNode));
L->next = NULL;
//L->next = NULL;
return L;
}
/*
*************头插法建链表**************
*/
void CreatFormHead(Linklist L)
{
int data;
scanf_s("%d",&data);
Linklist s;
while (data != -1)
{
s = (Linklist)malloc(sizeof(LinkNode));
s->num = data;
s->next = L->next;
L->next = s;
scanf_s("%d",&data);
}
L->next = NULL;
}
/*
****************输出链表******************
*/
void PrintList(Linklist L)
{
Linklist p;
p = L->next;
while (p)
{
printf("%2d",p->num);
p = p->next;
}
}
/*
****************尾插法建表*****************
*/
void CreatFormTail(Linklist L)
{
printf("输入-1结束创建\n");
int data;
Linklist s, tail;
tail = L;
scanf_s("%d", &data);
while (data != -1)
{
s = (Linklist)malloc(sizeof(LinkNode));
s->num = data;
tail->next = s;
tail = s;
scanf_s("%d",&data);
}
tail->next = NULL;
printf("创建:\n");
PrintList(L);
}
/*
****************遍历你要查找的第num个结点****************
*/
Linklist SearchNum(Linklist L, int num)
{
int flag=0;
Linklist p;
//p = L->next;
p = L;
while (p->next != NULL && flag < num)
{
p = p->next;
++flag;
break;
}
if (flag)
{
printf("查找成功\n");
return p;
}
else
{
printf("查找失败\n");
printf("温馨提示:请注意您输入的合理性\n");
return NULL;
}
}
/*
***********按值查找****************
*/
Linklist SearchValue(Linklist L, int value)
{
Linklist p;
int count=0;
p = L->next;
while (p != NULL)
{
if (p->num != value)
{
p = p->next;
}
else
{
++count;
/*printf("\n值为%d查找value成功!\n",value);
printf("该数据出现的第%d次\n",count);*/
p = p->next;
}
}
if (count == 0)
{
printf("查无此值\n");
}
printf("您所查询的值为%d一共出现过%d次\n",value,count);
return p;
}
/*
*********************删除 从0开始为首节点***************
*/
int DeleteNode(Linklist L,int pre,int *value)
{
Linklist p, r;
p = SearchNum(L, pre);
if (p != NULL)
{
r = p->next;
if (r != NULL)
{
p->next = r->next;
*value = r->num;
free(r);
printf("删除成功\n");
}
else
{
return 0;
}
}
else
{
return 0;
}
return 0;
}
void menu(Linklist L,int value)
{
if (value == 2)
{
int fla;
printf("请输入你要查的值\n");
scanf_s("%d", &fla);
SearchValue(L, fla);
}
else if (value == 3)
{
int fla;
printf("请输入你要查的结点位置\n");
scanf_s("%d", &fla);
SearchNum(L, fla);
}
else if (value == 4)
{
int fla,x;
printf("请输入你要删除的结点的前一个位置\n");
scanf_s("%d", &fla);
DeleteNode(L, fla, &x);
}
}
int main()
{
printf("*****************************\n");
printf("输入6创建链表\n");
printf("输入2按值查找\n");
printf("输入3按位置找\n");
printf("输入4删除结点\n");
printf("输入5查看结点\n");
printf("输入其他退出\n");
printf("*****************************\n");
Linklist LA;
LA=InitLinklist();
//CreatFormHead(LA);
int Value=1,x;
while (Value!=8)
{
scanf_s("%d", &Value);
switch (Value)
{
case 6:
CreatFormTail(LA);
break;
case 2:
menu(LA,Value);
break;
case 3:
menu(LA, Value);
break;
case 4:
menu(LA, Value);
break;
case 5:
PrintList(LA);
case 8:
break;
}
}
printf("程序结束运行!\n");
system("pause");
return 0;
}