#include <stdio.h>
#include <stdlib.h>
//节点结构体
struct Node
{
int a;
struct Node *pNext;
} ;
//头尾指针定义
struct Node *g_pHead=NULL;
struct Node *g_pEnd=NULL;
//空头链表初始化
void LianBiaoChuShi();
//尾添加
void WeiTianJia(int a);
//头添加
void TouTianJia(int a);
//任意位置添加
void RenYiTianJia(int index,int a); //在index后添加a
// 查找指定节点位置,返回地址
struct Node *SelectNode(int a);
//删除头
void ShanChuTou();
//删除尾
void ShanChuWei();
//删除中间任意节点
void ShanChuRenYi(int a);
//释放链表
//遍历链表
void BianLi();
int main()
{
LianBiaoChuShi();//空头链表初始化
//操作
WeiTianJia(1);
WeiTianJia(2);
WeiTianJia(3);
WeiTianJia(4);
BianLi();//遍历
printf("\n");
RenYiTianJia(3,6);
BianLi();//遍历
printf("\n");
ShanChuTou();//删除头
BianLi();//遍历
printf("\n");
ShanChuWei();
BianLi();//遍历
printf("\n");
ShanChuRenYi(2);
BianLi();//遍历
printf("\n");
system("pause");
return 0;
}
//空头链表初始化
void LianBiaoChuShi()
{
//链表空头
g_pHead=(struct Node *)malloc(sizeof(struct Node));
g_pHead->pNext=NULL;
g_pEnd= g_pHead;//头尾都是一个节点
}
//尾添加
void WeiTianJia(int a)
{
//创建一个节点
struct Node *pTemp= (struct Node *)malloc(sizeof(struct Node));
//节点成员赋值
pTemp->a=a;
pTemp->pNext=NULL;
if(NULL==pTemp)
{
printf("内存不足\n");
//return NULL;
}
//链接
g_pEnd->pNext=pTemp;
g_pEnd=pTemp;
}
//头添加
void TouTianJia(int a)
{
//创建一个节点
struct Node *pTemp= (struct Node *)malloc(sizeof(struct Node));
//节点成员赋值
pTemp->a=a;
pTemp->pNext=NULL;
if(NULL==pTemp)
{
printf("内存不足\n");
// return NULL;
}
//链接
pTemp->pNext=g_pHead->pNext;
g_pHead->pNext=pTemp;
}
//任意位置添加
void RenYiTianJia(int index,int a)
{
//判断链表为空
if(g_pHead->pNext==NULL)
{
printf("链表无节点\n");
}
//找插入位置
struct Node *pTemp=SelectNode(index);
if(NULL==pTemp)
{
printf("查无此节点\n");
}
//找到了,链接
//1.创建节点,把a装进去
//创建一个节点
struct Node *pT= (struct Node *)malloc(sizeof(struct Node));
//节点成员赋值
pT->a=a;
pT->pNext=NULL;
//2.链接
if(pTemp==g_pEnd)//如果插入的位置是尾部,调用尾添加
{
WeiTianJia(a);
}
else
{
pT->pNext=pTemp->pNext;
pTemp->pNext=pT;
}
}
// 查找指定节点位置,返回地址
struct Node *SelectNode(int a)
{
struct Node *pTemp=g_pHead->pNext;
while(pTemp!=NULL)
{
if(a==pTemp->a)
{
return pTemp;
}
printf("%d\n",pTemp->a);
pTemp=pTemp->pNext;
}
return NULL;
}
//遍历链表
void BianLi()
{
struct Node *pTemp=g_pHead->pNext;
while(pTemp!=NULL)
{
printf("%d\n",pTemp->a);
pTemp=pTemp->pNext;
}
}
//删除头
void ShanChuTou()
{
//判断链表为空
if(g_pHead->pNext==NULL)
{
printf("链表无节点\n");
}
//1记录这个点
struct Node *pTemp=g_pHead->pNext;
//2指向下一个
g_pHead->pNext=g_pHead->pNext->pNext;
//3释放
free(pTemp);
}
//删除尾
void ShanChuWei()
{
//判断链表为空
if(g_pHead->pNext==NULL)
{
printf("链表无节点\n");
}
if(g_pHead==g_pEnd)
{
free(g_pEnd);
g_pHead->pNext=NULL;
g_pEnd=g_pHead;
}
//有多个节点
else
{
struct Node *pTemp=g_pHead->pNext;
while(pTemp!=NULL)
{
if(pTemp->pNext==g_pEnd)//找到尾的前一个
{
break;
}
pTemp=pTemp->pNext;
}
//1释放尾巴
free(g_pEnd);
g_pEnd=pTemp;
//尾巴下一个赋值为空
g_pEnd->pNext=NULL;
}
}
void ShanChuRenYi(int a)
{
struct Node *pTemp=SelectNode(a);
if(NULL==pTemp)
{
printf("查无此节点\n");
}
//如果只有一个节点
if(g_pHead->pNext==g_pEnd)
{
ShanChuWei();
}
if(g_pHead==pTemp)
{
ShanChuWei();
}
else
{
//找位置
//找到删除点pTemp的前一个
struct Node *pT=g_pHead;
while(pT!=NULL)
{
if(pT->pNext==pTemp)
{
break;
}
pT=pT->pNext;
}
//先连
pT->pNext=pTemp->pNext;
//后删除
free(pTemp);
}
}
有空头链表
最新推荐文章于 2021-11-29 20:36:05 发布