#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode
{
ElemType data;
struct LinkNode *next;
}LinkNode, *LinkList;
LinkList InitNull();
LinkList InitListByHeadInsert();
void PrintList(LinkList L);
LinkList InitListByTailInsert();
int Len(LinkList L);
int GetElem(LinkList L, int index, ElemType *X);
int InsertNode(LinkList L, int index, ElemType data);
int DeleteNode(LinkList L, int index, ElemType *X);
void Reverse(LinkList L);
int main()
{
}
//建立空链表
LinkList InitNull()
{
LinkList L = malloc(sizeof(LinkNode));
L->next = NULL;
return L;
}
//头插法建立单链表
LinkList InitListByHeadInsert()
{
int data;
LinkList temp;
LinkList L = malloc(sizeof(LinkNode));
L->next = NULL;
printf("请输入数字,-1结束:");
scanf("%d", &data);
while(data != -1)
{
temp = malloc(sizeof(LinkNode));
temp->data = data;
temp->next = L->next;
L->next = temp;
printf("\n请继续输入数字,-1结束:");
scanf("%d", &data);
}
return L;
}
//尾插法建立单链表
LinkList InitListByTailInsert()
{
int data;
LinkList temp, tail;
LinkList L = malloc(sizeof(LinkNode));
tail = L;
L->next = NULL;
printf("请输入数字,-1结束:");
scanf("%d", &data);
while(data != -1)
{
temp = malloc(sizeof(LinkNode));
temp->data = data;
temp->next = tail->next;
tail->next = temp;
tail = temp;
printf("\n请继续输入数字,-1结束:");
scanf("%d", &data);
}
return L;
}
//获取链表中第i个元素的值,用X接受,返回1代表操作成功,0代表失败 ,链表中的索引从0开始
int GetElem(LinkList L, int index, ElemType *X)
{
LinkList temp = L->next;
int i = 0;
if(index < 0)
{
printf("索引位置非法!\n");
return 0;
}
while(temp != NULL && i < index)
{
temp = temp->next;
i++;
}
if(temp == NULL)
{
printf("索引位置非法!\n");
return 0;
}
else
{
*X = temp->data;
return 1;
}
}
//在链表中插入一个值,index表示元素插入后的位置,索引从0开始,返回1表示操作成功,0表示失败
int InsertNode(LinkList L, int index, ElemType data)
{
if(index < 0)
{
printf("插入位置非法!\n");
return 0;
}
LinkList Ptr = L;
LinkList temp = NULL;
int i = 0;
while(Ptr != NULL && i < index)
{
Ptr = Ptr->next;
i++;
}
if(Ptr == NULL)
{
printf("插入位置非法!\n");
return 0;
}
else
{
temp = malloc(sizeof(LinkNode));
temp->data = data;
temp->next = Ptr->next;
Ptr->next = temp;
}
}
//从链表中插入一个值,index表示元素的位置,索引从0开始,返回1表示操作成功,0表示失败,返回元素的值存在X中
int DeleteNode(LinkList L, int index, ElemType *X)
{
if(index < 0)
{
printf("删除位置非法!\n");
return 0;
}
LinkList Ptr = L;
LinkList temp = NULL;
int i = 0;
while(Ptr != NULL && i < index)
{
Ptr = Ptr->next;
i++;
}
if(Ptr == NULL || Ptr->next == NULL)
{
printf("删除位置非法!\n");
return 0;
}
else
{
temp = Ptr->next;
*X = temp->data;
Ptr->next = temp->next;
free(temp);
}
}
//单链表的逆置
void Reverse(LinkList L)
{
LinkList CurrentNode = L->next;
LinkList NextNode = NULL;
L->next = NULL;
while(CurrentNode != NULL)
{
NextNode = CurrentNode->next;
CurrentNode->next = L->next;
L->next = CurrentNode;
CurrentNode = NextNode;
}
}
//求链表的长度
int Len(LinkList L)
{
LinkList temp = L->next;
int len = 0;
while(temp != NULL)
{
len++;
temp = temp->next;
}
return len;
}
//打印链表中的元素
void PrintList(LinkList L)
{
LinkList temp = L->next;
while(temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}