#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
}LinkList;
LinkList InitList()
{
LinkList P;
LinkList* L = (LinkList *)malloc(sizeof(LinkList));
L = &P;
if (L == NULL)
{
printf("分配失败\n");
exit(1);
}
L->next = NULL;
return P;
}
void HandInsert(LinkList *L,int x)
{
printf("头插法插入数据:%d\n",x);
LinkList * P = L;
LinkList * Q = (LinkList*)malloc(sizeof(LinkList));
Q->data = x;
Q->next = NULL;
Q->next = P->next;
P->next = Q;
}
void TailInsert(LinkList *L,int x)
{
printf("尾插法插入数据:%d\n",x);
LinkList * P = L;
LinkList * Q = (LinkList*)malloc(sizeof(LinkList));
Q->data = x;
while(P->next != NULL)
P = P->next;
P->next = Q;
Q->next = NULL;
P->next = Q;
P = Q;
}
void InsertValue(LinkList* L,int i,int x)
{
if(i < 1)
{
printf("插入的位置不合法\n");
return;
}
LinkList * P = L;
int j = 0;
while ( P != NULL && j< i-1)
{
P = P->next;
j++;
}
LinkList * Q = (LinkList*)malloc(sizeof(LinkList));
Q->data = x;
Q->next = P->next;
P->next = Q;
}
void DeleteValue(LinkList * L,int i)
{
if(i < 1)
{
printf("删除的位置不合法!\n");
return;
}
int j = 0;
LinkList * P = L;
while (P != NULL && j < i - 1)
{
P = P->next;
j++;
}
if(P->next == NULL)
{
printf("第%d之后结点之后没有结点了!\n",i-1);
return;
}
LinkList * Q = P->next;
P->next = Q->next;
free(Q);
}
void FindElem(LinkList* L,int i)
{
if(i < 1)
{
printf("查找的位置不合法!\n");
exit(1);
}
LinkList * P = L;
int j = 0;
while (P != NULL && j < i)
{
P = P->next;
j++;
}
if(P == NULL){
printf("超出最大节点数\n");
return;
}
printf("找到了第%d个位置的元素为:%d\n",i,P->data);
}
void FindValue(LinkList* L,int x)
{
LinkList * P = L;
while (P != NULL && P->data != x)
{
P = P->next;
}
if (P != NULL&& P->data == x)
{
printf("找到了该元素%d\n", x);
}
if (P == NULL)
{
printf("没有找到该元素%d\n", x);
}
}
void ShowList(LinkList *L)
{
LinkList * P = L;
if(P->next == NULL)
{
printf("链表是空表!\n");
return;
}
while (P->next != NULL)
{
P = P->next;
printf("输出数据为:%d\n",P->data);
}
}
void ReverseList(LinkList* L)
{
printf("链表的逆置:\n");
LinkList* P = L;
LinkList* Q = L;
LinkList* T = P;
while (Q->next != NULL){
Q = Q->next;
}
while (P->next != Q){
T = P->next;
P->next = T->next;
T->next = Q->next;
Q->next = T;
}
}
int LengthList(LinkList* L)
{
LinkList* P = L;
int len = 0;
P = P->next;
while (P != NULL)
{
P = P->next;
len++;
}
return len;
}
int main()
{
LinkList L = InitList();
TailInsert(&L,6);
TailInsert(&L,7);
TailInsert(&L,8);
TailInsert(&L,9);
TailInsert(&L,10);
HandInsert(&L,1);
HandInsert(&L,2);
HandInsert(&L,3);
HandInsert(&L,4);
HandInsert(&L,5);
ShowList(&L);
InsertValue(&L,2,0);
DeleteValue(&L,12);
printf("单链表的长度为:%d\n",LengthList(&L));
FindElem(&L,5);
FindElem(&L,12);
FindValue(&L,5);
FindValue(&L,20);
ReverseList(&L);
ShowList(&L);
return 0;
}