
//双链表
#include "stdafx.h"
#include
#include
//定义双向链表结点
typedef struct DLNode
{
int iNum; //数据域
struct DLNode *prior;
struct DLNode *next;
}DLNodes, *PDLNodes;
/*
pphead : 头指针
pptail :尾指针
i : 结点值
插入结点(头插法,在左边插入结点)
*/
void list_insert_head(PDLNodes *pphead, PDLNodes *pptail, int i)
{
PDLNodes pnew;
pnew = (PDLNodes)calloc(1, sizeof(DLNodes));
pnew->iNum = i;
if(*pptail == NULL) //如果链表为空
{
*pphead = pnew;
*pptail = pnew;
}
else
{
pnew->next = *pphead; //新结点的next成员指向原有链表
(*pphead)->prior = pnew; //新结点的prior指向原有链表头
*pphead = pnew; //新结点成为新的链表头
}
}
//打印输出双向链表结点
void list_print_func(PDLNodes phead,PDLNodes ptail)
{
PDLNodes pcur = phead; //将头指针给当前指针pcur
printf("\n顺序输出双向链表的所有结点:\n");
while(pcur != NULL)
{
printf("%d\t",pcur->iNum);
pcur = pcur->next;
}
printf("\n");
pcur = ptail; //将尾指针
printf("\n逆序输出双向链表的所有结点:\n");
while(pcur != NULL)
{
printf("%d\t",pcur->iNum);
pcur = pcur->prior;
}
printf("\n");
}
//删除结点
void list_delete_func(PDLNodes *pphead,PDLNodes *pptail,int i)
{
PDLNodes pcur = *pphead;
PDLNodes pbefore = *pphead;
if(NULL == *pptail) //证明链表为空
{
printf("\n双向链表为空.\n");
}
else if(i == (*pphead)->iNum)//如果要删除第一个结点(此时可能只剩下一个结点)
{
(*pphead)->next->prior = (*pphead)->prior;//下一个结点的prior指向原有头结点的prior
*pphead = (*pphead)->next;//头指针要指向下一个结点
free(pcur); //释放原有头结点的内存
if(*pphead == NULL) //如果删除之后链表为空
{
*pptail = NULL;
}
}
else //如果不等于第一个结点
{
while(NULL != pcur) //如果pcur没有走出最后一个结点
{
if(i == pcur->iNum)
{
pcur = pcur->next;
pbefore->next = pcur;
pcur->prior = pbefore;
return;
}
else
{
pbefore = pcur;
pcur = pcur->next;
}
}
if(NULL == pcur) //如果执行到最后
{
printf("\n证明你要删除的数据结点不存在");
}
}
}
//查找结点
void list_find_func(PDLNodes *pphead,PDLNodes *pptail,int i)
{
PDLNodes pcur = *pphead;
PDLNodes pbefore = *pptail;
if(NULL == *pptail) //证明链表为空
{
printf("\n双向链表为空.\n");
}
else
{
while(NULL != pcur) //只要不是最后
{
if(i == pcur->iNum)
{
printf("\n查询成功,你要查找的数据存在.\n");
return;
}
else
{
pbefore = pcur;
pcur = pcur->next;
}
}
if(NULL == pcur) //如果执行到最后
{
printf("\n证明你要查找的数据结点不存在.\n\n");
}
}
}
int main(int argc,char* argv[])
{
int i;
PDLNodes phead = NULL;
PDLNodes ptail = NULL;
// 插入结点
printf("\n\n请输入你要插入的结点:\n");
while(scanf("%d",&i) != EOF)
{
//调用插入结点函数
list_insert_head(&phead, &ptail, i);
}
//输出 *** 作
list_print_func(phead,ptail);
//删除结点
printf("\n\n请输入你要删除结点的数据:");
while (scanf("%d",&i) != EOF)
{
//调用删除结点函数
list_delete_func(&phead,&ptail,i);
printf("\n删除之后链表的结果为:");
list_print_func(phead,ptail);
}
//查找结点
printf("\n请你输入要查找的结点:");
while(scanf("%d",&i) != EOF)
{
//调用查找函数
list_find_func(&phead,&ptail,i);
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)