您的位置:首页 > 编程语言 > C语言/C++

c语言链表各种操作

2017-06-28 10:18 477 查看
实现链表的数据查询, 计数,翻转,插入,删除,

#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)
{

4000
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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 链表 结构