#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * LinkList;
LinkList List_H(LinkList& L) //头插法插入元素
{
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("请输入链表元素的值(输入-1结束)\n:");
scanf_s("%d", &x);
while (x != -1)
{
s = (LNode*)malloc(sizeof(LNode));
s->next = NULL;
s->data = x;
s->next = L->next;
L->next = s;
scanf_s("%d", &x);
}
return L;
}
LinkList List_T(LinkList& L) { //尾插法循环插入元素
LNode* s, * r;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
r = L;
printf("请输入链表中元素的值:(输入9结束)\n");
scanf_s("%d", &x);
while (x != 9)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = NULL; //最后一个元素末尾置空;
r->next = s;
r = s;
scanf_s("%d", &x);
}
return L;
}
LinkList PrintfList(LinkList L) //打印元素
{
LNode* p;
p = L->next; //p指向第1号元素
if (p == NULL)
printf("NULL");
else
printf("打印链表中的元素:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
return L;
}
LNode* GetElem(LinkList L, int i) //查找第i号元素;
{
int j = 1;
LNode* p = L->next;
if (i == 0) //头节点输出NULL;
return NULL;
while (p!=NULL&&j < i)
{
if (i < 0&&p->next ==NULL) //不合理值处理
return NULL;
else
p = p->next;
j++;
}
return p;
}
LNode* Getdata(LinkList L, int e) //按值查找;
{
LNode* p = L->next;
while (p!= NULL)
{
if (p->data == e)
return p;
if (p ->next== NULL)
return NULL;
p = p->next;
}
}
int LengthLink(LinkList L) //求表长
{
int len = 0;
LNode* p = L;
while (p->next != NULL)
{
p=p->next;
len++;
}
return len;
}
bool InsertNextNode(LNode* p, int e) //插入元素
{
if (p == NULL)
return false;
LNode* s;
s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)
return false;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete(LNode* p) //删除元素
{
if (p == NULL)
return false;
if (p->next == NULL)
return false;
LNode* q = p->next;
p->next = q->next;
free(q);
return true;
}
int main() //主函数
{
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
while(1)
{
printf("\n请输入接下来的操作:\n");
printf("1:创建表,输入元素并打印元素\n");
printf("2:寻找第i号元素并打印\n");
printf("3:寻找元素x\n");
printf("4:求表长\n");
printf("5:打印链表中所有元素:\n");
printf("6:插入元素\n");
printf("7:删除元素\n");
printf("-1:退出\n\n");
int x;
scanf_s("%d", &x);
int n, len;
int elem;
int e = 0, m = 0;
int j = 0;
LNode* i, * p, * c, * d;
if (x == -1)
break;
switch (x)
{
case 1:
List_T(L);
printf("\n");
break;
case 2:
printf("查找第几号元素:");
scanf_s("%d", &n);
printf("\n打印出第%d号元素:", n);
i = GetElem(L, n);
if (i == NULL)
printf("没有该值");
else
printf("%d", i->data);
printf("\n");
break;
case 3:
printf("输入需要查找的元素:");
scanf_s("%d", &elem);
p = Getdata(L, elem);
if(p==NULL)
printf("没有该值\n");
else
printf("%d", p->data);
printf("\n");
break;
case 4:
len = LengthLink(L);
printf("\n表长:%d", len);
printf("\n");
break;
case 5:
printf("链表中元素所有的值为:");
PrintfList(L);
break;
case 6:
printf("请输入需要插入元素位置之前的元素:");
scanf_s("%d",&m);
c = Getdata(L, m);
printf("请输入需要插入的元素:");
scanf_s("%d",&e);
InsertNextNode(c, e);
break;
case 7:
printf("查找第几号元素并删除:");
scanf_s("%d", &j);
d = GetElem(L, j - 1);
ListDelete(d);
}
}
}