#include <stdio.h>
#include <stdlib.h>
//节点结构体
struct Node
{
int a;
struct Node *pNext;
} ;
//链表的头尾指针
struct Node *g_pHead=NULL;
struct Node *g_pEnd=NULL;
//链表清空 需要遍历
void qingkong() ;
//创建链表,在链表中增加一个数据(头添加)
void Add(int a);
//遍历链表,查,查指定的
void chakan() ;
//查询指定节点
struct Node *SelectNode(int a);
//指定位置插入节点
void charu(int index,int a);
//头添加+头删除=栈
//头添加+ 尾删除 或者:尾添加+头删除 =队列
//头删除
void shanchutou();
//尾删除
void shanchuwei();
//删除指定节点
void ShanChuZhiding(int a);
int main()
{
int a[]={1,2,3};//数组传进链表
int i=0;
for(i=0;i<3;i++)
{
Add(a[i]);
}
chakan() ;//遍历
charu(1,5);//在1的后面添加5
//查找指定的
struct Node *pFind=SelectNode(3) ;
if(pFind!=NULL) //找到了
{
printf("%d\n",pFind->a );
}
else
printf("没有查找到相应数据");
printf("\n");
chakan() ;//遍历
printf("\n");
shanchutou();//删除头
chakan() ;//遍历
printf("\n");
shanchuwei();
chakan() ;//遍历
printf("\n");
ShanChuZhiding(2);//删除2
chakan() ;//遍历
qingkong();
system("pause");
return 0;
}
//链表清空 需要遍历
void qingkong()
{
struct Node *pTemp=g_pHead;//定义一个 pTemp指针指向开头
while(pTemp!=NULL)
{
struct Node *pt=pTemp;
//不可以free(pTemp)
pTemp=pTemp->pNext;
free(pt); //先定义一个指针去记录 pTemp再释放
g_pHead=NULL;
g_pEnd=NULL;//头尾清空
}
}
//创建链表,在链表中增加一个数据(头添加)
void Add(int a)
{
struct Node *pTemp=(struct Node *)malloc(sizeof(struct Node));
pTemp->a=a;
pTemp->pNext=NULL;//必须
if(g_pHead==NULL)
{
g_pHead=pTemp;
g_pEnd=pTemp;
}
else
{
pTemp->pNext=g_pHead;
g_pHead=pTemp;
}
}
//遍历链表,查,查指定的
void chakan()
{
struct Node *pTemp=g_pHead;//定义一个 pTemp指针指向开头
while(pTemp!=NULL)
{
printf("%d\n",pTemp->a );
pTemp=pTemp->pNext;
}
}
//查询指定节点
struct Node *SelectNode(int a)
{
struct Node *pTemp=g_pHead;//定义一个 pTemp指针指向开头
while(pTemp!=NULL)
{
if(pTemp->a==a)
{
return pTemp;
}
pTemp=pTemp->pNext;
}
return NULL; //没找到
}
//指定位置插入节点
void charu(int index,int a)
{
if(NULL==g_pHead)
{
printf("链表没有节点");
return ;
}
//找位置
struct Node *pt= SelectNode(index);
if(pt==NULL)
{
printf("没有指定节点/n");
}
//有节点,给a创建节点
struct Node *pTemp=(struct Node *)malloc(sizeof(struct Node));
pTemp->a=a;
pTemp->pNext=NULL;
//连接链表
if(pt==g_pEnd)
{
g_pEnd->pNext=pTemp;//尾巴最后一个指向新节点
g_pEnd=pTemp;//新节点最后一个变成尾巴
}
else
{
pTemp->pNext=pt->pNext;//先连
pt->pNext=pTemp;
}
}
//头删除
void shanchutou()
{
if(NULL==g_pHead)
{
printf("链表为空\n");
}
struct Node *pTemp=g_pHead;//记录旧的头
g_pHead=g_pHead->pNext;//头的下一个变成新的头
free(pTemp);
}
//尾删除
void shanchuwei()
{
if(NULL==g_pHead)
{
printf("链表为空\n");
}
//链表不为空
//链表有1个节点
if(g_pHead==g_pEnd)
{
free(g_pHead);
g_pHead=NULL;
g_pEnd=NULL;
}
else //多个节点
{
//找到尾巴前一个节点
struct Node *pTemp=g_pHead;
while(pTemp->pNext!=g_pEnd)
{
pTemp=pTemp->pNext;
}
//找到了后:1:释放
free(g_pEnd);
g_pEnd=pTemp; //2尾巴下移
g_pEnd->pNext=NULL; //3尾巴的下一条指针赋值为空
}
}
//删除指定节点
void ShanChuZhiding(int a)
{
//链表判断
if(NULL==g_pHead)
{
printf("链表为空\n");
return ;
}
//链表有东西 找节点
struct Node *pTemp=SelectNode(a);
if(NULL==pTemp)
{
printf("没有节点\n");
return ;
}
//找到了
//只有一个节点
if(g_pHead==g_pEnd)
{
shanchutou();
}
//两个节点
else if(g_pHead->pNext==g_pEnd)
{
if(g_pHead==pTemp)
{
shanchutou();
}
else
{
shanchuwei();
}
}
//多个节点
else
{
if(g_pHead==pTemp)
{
shanchutou();
}
else if(g_pEnd==pTemp)
{
shanchuwei();
}
else
{
//找到删除节点的前一个节点
struct Node *pT=g_pHead;
while(pT->pNext!=pTemp)
{
pT=pT->pNext;
}
//找到了
//连接
pT->pNext=pTemp->pNext;
free(pTemp);
//释放
}
}
}
运行结果: