实现链表的数据查询, 计数,翻转,插入,删除,
#include<stdio.h>
#include<stdlib.h>
typedef struct linknode // 定义结构体 //typedef 简化创建的struct
{
int data;
struct linknode *pnext;
}node;
void init(node *phead, int data) //初始化头结点
{
phead->pnext = NULL;
phead->data = 0;
}
node *deletefirst(node*phead, int findata) //删除找到的data
{
node *p1=NULL,*p2=NULL; //双指针法
p1 = phead; //保存头结点
while(p1 != NULL)
{
if(p1->data != findata)
{
p2 = p1; //p2保存p1上一个位置
p1 = p1->pnext; //向前移动
}
else
{
break;
}
}
if(p1 != phead) //不是头结点
{
p2->pnext = p1->pnext; //跳过p1
free(p1); //删除p1
}
else
{
phead = phead->pnext;
free(p1); //头部删除
}
return phead;
}
//尾部添加数据
node *addback(node *phead , int data)
{
node *pnew = (node*)malloc(sizeof(node)); //创建结构体指针变量pnew 并动态分配内存
pnew->data = data;
pnew->pnext = NULL; //尾指针的pnext字段设置为null
if(phead == NULL)
{
phead = pnew; //直接相连
}
else
{
node *ptemp = phead; //备份头结点
while(ptemp->pnext != NULL)
{
ptemp = ptemp->pnext;
}
ptemp->pnext = pnew;
}
return phead;
}
// 显示链表
void show(node *phead)
{
if(phead == NULL)
{
return;
}
else
{
printf("%d, %p, %p\n",phead->data, phead, phead->pnext);
show( phead->pnext ); //递归调用 全部显示
}
}
void addhead(node **pphead, int data) //头部插入
{
node *pnew = (node *)malloc(sizeof(node));
pnew->data = data;
pnew->pnext = NULL; //先赋值为null
if(pphead == NULL)
{
*pphead = pnew; //直接连接
}
else
{
pnew->pnext = *pphead;
*pphead = pnew;
}
}
//链表的啊反转
node *revit(node *phead)
{
if(phead == NULL || phead->pnext == NULL)
{
return;
}
else
{
node *pre = NULL; //创建3个指针
node *pcur = NULL; //当前节点指针
node *pext = NULL; //当前节点下一个节点指针
pre = phead; //让pre为当前头结点
pcur = phead->pnext;
while(pcur != NULL)
{
pext = pcur->pnext; //备份下一个节点
pcur->pnext = pre; //指针翻转
pre = pcur; //前进
pcur = pext;
}
phead->pnext = NULL;
phead = pre;
}
return phead;
}
//查找数据
node *search(node*phead, int finddata)
{
node *p;
for(p = phead;p!=NULL;p=p->pnext)
{
if(p->data == finddata)
{
return p; //返回找到地址
}
}
return NULL;
}
//在链表中插入数据
node *insert(node*phead, int finddata, int newdata)
{
node *pew;
node *p1=NULL,*p2=NULL; //双指针法
p1 = phead; //保存头结点
pew = (node *)malloc(sizeof(node)); //创建pew结构体指针 并动态分配内存
pew->data = newdata; //吧新数据赋给pew的数据域
pew->pnext = NULL;
while(p1 != NULL)
{
if(p1->data != finddata)
{
p2 = p1; //p2保存p1上一个位置
p1 = p1->pnext; //向前移动
}
else
{
break;
}
}
if(phead==p1)
{
pew->pnext = phead; //保存头结点
phead = pew; //头部插入
}
else
{
pew->pnext = p1;
p2->pnext = pew;
}
}
//获取当前链表的数量
int getnum(node *phead)
{
if(phead == NULL)
{
return 0;
}
else
{
return 1+ getnum(phead->pnext); //向后传递参数
}
}
//冒泡排序
void bubble(node *phead)
{
node *p1,*p2;
for(p1 = phead; p1!=NULL;p1 = p1->pnext) //用双for循环 双指针
{
for(p2 = phead; p2 != NULL; p2=p2->pnext)
{
if(p1->data>p2->data) //判定大小
{
int temp;
temp = p1->data; //交换数据
p1->data = p2->data;
p2->data = temp;
}
}
}
}
//bubble(phead);
void main()
{
node *phead = NULL;
//init(phead,0);
phead=addback(phead, 11);
phead=addback(phead, 12);
phead=addback(phead, 13);
phead=addback(phead, 14);
phead=addback(phead, 15);
show(phead);
phead = revit(phead);
printf("\n\n\n");
//addhead(&phead, 20);
//node *pfind = search(phead,13 );
//pfind->data = 99; //修改13
/*phead = deletefirst(phead, 11);
phead = deletefirst(phead, 12);*/
printf("%d", getnum(phead));
phead = insert(phead, 13,88);
phead = insert(phead, 11,77);
show(phead);
system("pause");
}