#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct NODE{
ElemType data;
struct NODE* next;
}Node,*NodePtr;//链表节点
typedef struct LIST{
NodePtr head;
int size;
}List,*ListPtr;//链表,头结点为0位置
ListPtr InitList();//初始化链表
void InsertList(ListPtr L, int i, ElemType e);//如果i满足条件在链表的i位置插入元素e
void DeleteList(ListPtr L, int i, ElemType* e);//如果i满足条件在链表的i位置删除元素,并用e返回他的值
bool EmptyList(ListPtr L);//判断链表是否为空
int LengthList(ListPtr L);//返回链表长度
void GetElemType(ListPtr L, int i, ElemType* e);//用e返回链表i位置的元素
void FreeList(ListPtr L);//释放链表内存
void PrintList(ListPtr L);//打印链表
void InsertTail(ListPtr L, ElemType e);//尾插法将元素插入表尾
int main()
{
puts("创建链表");
ListPtr L = InitList();
puts("判断链表是否为空");
if (EmptyList(L))
{
puts("链表为空");
}
else
{
puts("链表不为空");
}
puts("输出链表长度");
printf("%d\n", LengthList(L));
puts("将0到9插入链表当中");
for (int i = 0; i < 10; i++)
{
InsertTail(L, i);
}
puts("删除链表中第5个元素,并用e返回它的值");
ElemType e;
DeleteList(L, 5, &e);
printf("e的值是%d\n", e);
puts("判断链表是否为空");
if (EmptyList(L))
{
puts("链表为空");
}
else
{
puts("链表不为空");
}
puts("输出链表长度");
printf("%d\n", LengthList(L));
puts("打印链表");
PrintList(L);
puts("释放链表内存");
FreeList(L);
system("pause");
return 0;
}
ListPtr InitList()
{
ListPtr L = (ListPtr)malloc(sizeof(List));
L->head = (NodePtr)malloc(sizeof(Node));
L->head->next = NULL;
L->size = 0;
return L;
}
void InsertList(ListPtr L, int i, ElemType e)
{
if (i < 1 || i > L->size + 1)
{
return;
}
NodePtr newnode = (NodePtr)malloc(sizeof(Node));
newnode->data = e;
newnode->next = NULL;
NodePtr temp;
temp = L->head;
int count = 0;
while (count != i - 1)
{
temp = temp->next;
count++;
}
newnode->next = temp->next;
temp->next = newnode;
L->size++;
}
void DeleteList(ListPtr L, int i, ElemType* e)
{
if (i < 0 || i > L->size)
{
puts("1111");
return;
}
if (EmptyList(L))
{
return;
}
NodePtr temp;
temp = L->head;
int count = 0;
while (count != i - 1)
{
temp = temp->next;
count++;
}
*e = temp->next->data;
NodePtr freenode = temp->next;
temp->next = temp->next->next;
free(freenode);
L->size--;
}
bool EmptyList(ListPtr L)
{
if (L->size == 0)
{
return true;
}
else
{
return false;
}
}
int LengthList(ListPtr L)
{
return L->size;
}
void GetElemType(ListPtr L, int i, ElemType* e)
{
if (i < 0 || i > L->size)
{
return;
}
if (EmptyList(L))
{
return;
}
NodePtr temp;
temp = L->head;
int count = 0;
while (count != i - 1)
{
temp = temp->next;
count++;
}
*e = temp->next->data;
}
void FreeList(ListPtr L)
{
if (!EmptyList(L))
{
return;
}
NodePtr tempnode = L->head->next;
NodePtr freenode;
while (tempnode != NULL)
{
freenode = tempnode;
tempnode = tempnode->next;
free(freenode);
}
}
void PrintList(ListPtr L)
{
NodePtr tempnode = L->head->next;
while (tempnode != NULL)
{
printf("%d ", tempnode->data);
tempnode = tempnode->next;
}
putchar('\n');
}
void InsertTail(ListPtr L, ElemType e)
{
InsertList(L, LengthList(L) + 1, e);
}