#define _CRT_SECURE_NO_WARNINGS 1
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef void status;
typedef struct Lnode
{
ElemType data;
struct Lnode* next;
}Lnode,*LinkList;
void PrintList(Lnode* L);
Lnode *InitList(Lnode *L)
{
L = (Lnode*)malloc(sizeof(Lnode));
L->next = NULL;
return L;
}
void Init(Lnode* L)
{
L->next = NULL;
}
int IsEmpty(Lnode *L)
{
if (L->next == NULL)
{
printf("222");
return -1;
}
else
{
printf("111");
return 1;
}
}
void DestroyList(Lnode *L)
{
Lnode* p;
while (L != NULL)
{
p = L;
L = L->next;
free(p);
}
}
void QkList(Lnode *L)
{
Lnode* p, * q;
p = L->next;
while (p != NULL)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;
}
int length(Lnode *L)
{
Lnode* p;
p = L->next;
int n = 0;
if (p)
{
n++;
p = p->next;
}
return n;
}
int FindElemList(Lnode *L,int i,ElemType e)
{
Lnode* p;
p = L->next;
int j = 1;
while (p&&j<i)
{
p = p->next;
++j;
}
if (!p||j>i)
{
return -1;
}
e = p->data;
return e;
}
int SearchList(Lnode *L, int x)
{
int i = 1;
Lnode* p;
p = L->next;
while (p && p->data!=x)
{
p = p->next;
i++;
}
if (p != NULL)
{
return i;
}
else
{
return -1;
}
}
void Insert_List(Lnode* L, int i, ElemType e)
{
Lnode* p, * s;
p = L;
int j = 0;
while (p && j < i - 1)
{
p = p->next;
++j;
}
if (!p || j > i - 1)
{
printf("Erron!");
}
s = (LinkList)malloc(sizeof(Lnode));
s->data = e;
s->next = p->next;
p->next = s;
}
void deletelist(Lnode *L,int i)
{
Lnode* p,*q;
p = L;
int j = 0;
while (p->next && j < i - 1)
{
p = p->next;
++j;
}
if (!(p->next) || j > i - 1)
{
printf("Erron!");
}
q = p->next;
p->next = q->next;
free(q);
}
void PrintList(Lnode* L)
{
printf("该链表的内容为:");
while (L->next != NULL) {
printf("%d ", L->next->data);
L = L->next;
}
printf("\n");
}
void create_list(Lnode *L)
{
Lnode* p;
int n = 0;
int num;
printf("请输入元素个数:\n");
scanf("%d", &n);
printf("请输入元素:\n");
for (int i = 0;i<n;i++)
{
scanf("%d", &num);
p = (Lnode*)malloc(sizeof(Lnode));
p->data = num;
p->next = L->next;
L->next = p;
}
}
void creatfromtail(Lnode* L) {
Lnode* p;
int n = 0;
int num;
printf("请输入元素个数:\n");
scanf("%d", &n);
printf("请输入元素:\n");
for (int i = 0; i < n; i++)
{
scanf("%d", &num);
p = (Lnode*)malloc(sizeof(Lnode));
p->data = num;
L->next = p;
L = p;
}
}
void showMenu()
{
printf("\t 【0】头插法输入\n");
printf("\t 【1】尾插法输入\n");
printf("\t 【2】查找\n");
printf("\t 【3】删除\n");
printf("\t 【4】某个位置插入数据\n");
printf("\t 【5】退出\n");
return;
}
int main()
{
Lnode *L = NULL;
Lnode* M= NULL;
int m,x,y;
printf("链表L初始化:\n");
L = InitList(L);
printf("链表L初始化成功:\n");
printf("链表L初始化:\n");
M = InitList(M);
printf("链表M初始化成功:\n");
while (true)
{
printf("你想选择的操作:\n");
showMenu();
printf("请输入:\n");
scanf("%d", &m);
switch (m)
{
case 0:
printf("用头插法插入链表L:\n");
create_list(L);
PrintList(L);
break;
case 1:
printf("用尾插法插入链表M:\n");
creatfromtail(M);
PrintList(M);
break;
case 2:
printf("输入查询数据:\n");
scanf("%d", &x);
printf("%d在元素中的位置为:%d\n", x,SearchList(L, x));
break;
case 3:
printf("输入删除数据:\n");
scanf("%d", &x);
deletelist(L, x);
PrintList(L);
break;
case 4:
printf("输入插入位置:\n");
scanf("%d", &x);
printf("输入数据:\n");
scanf("%d", &y);
Insert_List(L, 2, y);
printf("插入成功:\n");
PrintList(L);
break;
case 5:
exit(-1);
default:
printf("输入有误!");
}
}
return 0;
}
