//头文件"hanshu shengming.h"
#pragma once
typedef int Datatype;
typedef struct LNode
{
int val;
struct LNode* next;
}LinkList;
//动态申请节点
LinkList* BuyLNode(Datatype x);
//打印
void PrintList(LinkList* plist);
//尾插
void TailInsert(LinkList** plist,Datatype x);
//头插
void HeadInsert(LinkList** plist, Datatype x);
//尾删
void TailDele(LinkList** plist);
//头删
void HeadDele(LinkList** plist);
//查找
LinkList* Find(LinkList* plist, Datatype x);
//在指定位置pos(地址)后插入X
void Insertafter(LinkList* pos, Datatype x);
//删指定位置pos后的值
void Deleafter(LinkList* pos);
//销毁
void Destroy(LinkList** plist);
//统计链表元素个数
int Count(LinkList* p);
void Test();
//实现操作函数"functionrealize.c"
#define _CRT_SECURE_NO_WARNINGS
#include"hanshu shengming.h"
#include<stdio.h>
#include<stdlib.h>
//动态申请节点
LinkList* BuyLNode(Datatype x)
{
LinkList* newnode = (LinkList*)malloc(sizeof(LinkList));//动态分配空间
if (newnode == NULL)//分配失败
{
exit(0);
}
newnode->val = x;
newnode->next = NULL;
return newnode;
}
//打印
void PrintList(LinkList* plist)
{
LinkList* p = plist;
while (p)
{
printf("%d——>", p->val);
p = p->next;
}
printf("NULL\n");
}
//尾插
void TailInsert(LinkList** plist, Datatype x)
{
if (*plist == NULL)//空表
{
*plist = BuyLNode(x);
}
else
{
LinkList* tail = *plist;
while (tail->next)//找到最后一个节点
{
tail = tail->next;
}
tail->next = BuyLNode(x);
}
}
//头插
void HeadInsert(LinkList** plist, Datatype x)
{
LinkList* newnode=BuyLNode(x);//创造一个节点
newnode->next = *plist;
*plist = newnode;
}
//尾删
void TailDele(LinkList** plist)
{
LinkList* p = *plist;
if (*plist == NULL)//空表
{
return;
}
else if (p->next == NULL)//只有一个节点
{
free(p);
p = NULL;
return;
}
else
{
while (p->next->next != NULL)
{
p = p->next;
}
free(p->next);
p->next = NULL;
}
}
//头删
void HeadDele(LinkList** plist)
{
if (*plist == NULL)//空表
{
return;
}
else if ((*plist)->next == NULL)//只有一个节点
{
free(*plist);
*plist = NULL;
return;
}
else
{
LinkList* cur = *plist;
*plist = cur->next;
free(cur);
cur = NULL;
return;
}
}
//查找
LinkList* Find(LinkList* plist, Datatype x)
{
LinkList* p = plist;
while (p && p->val != x)
{
p = p->next;
}
if (p)
return p;
else
printf("查找失败");
}
//在指定位置pos(地址)后插入X
void Insertafter(LinkList* pos, Datatype x)
{
LinkList* newnode = BuyLNode(x);
newnode->next = pos->next;
pos->next = newnode;
}
//删指定位置pos后的值
void Deleafter(LinkList* pos)
{
if (pos == NULL||pos->next==NULL)//空表或只有一个节点,即没有可删除的节点
{
return;
}
else
{
LinkList* p = pos->next;
pos->next = p->next;
free(p);
p = NULL;
}
}
//销毁
void Destroy(LinkList** plist)
{
LinkList* p = *plist;
while (p)
{
*plist = p->next;
free(p);
p = *plist;
}
*plist = NULL;
}
//统计
int Count(LinkList* p)
{
int x=0;
while (p != NULL)
{
x++;
p = p->next;
}
return x;
}
void Test()
{
LinkList* s = NULL;//不带头结点的单链表
int i=0;
HeadInsert(&s, 1);
HeadInsert(&s, 2);
HeadInsert(&s, 3);
HeadInsert(&s, 9);
PrintList(s);
/*TailDele(&s);//测试尾删
PrintList(s);
TailDele(&s);
PrintList(s);
TailDele(&s);
PrintList(s);*/
/*HeadDele(&s);//测试头删
PrintList(s);
HeadDele(&s);
PrintList(s);*/
LinkList* s1 = NULL;
s1 = Find(s, 3);//查找
printf("%d\n", s1->val);
Insertafter(s1, 11);//指定位置后插入
Insertafter(s1, 12);
PrintList(s);
Deleafter(s1);//指定位置后删除
PrintList(s);
i = Count(s);//统计个数
printf("%d\n", i);
Destroy(&s);//销毁
PrintList(s);
}
#define _CRT_SECURE_NO_WARNINGS
#include"functionrealize.c"
int main()
{
Test();
return 0;
}