#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *pnext;
}linknode;
// 头节点不存储值,仅next指向
linknode *createlinklist(void)
{
// 创建链表,分配空间,1个node 作为头节点
linknode *ptmpnode = NULL;
ptmpnode = malloc(sizeof(linknode));
if (NULL == ptmpnode)
{
printf("malloc failed!\n");
return NULL;
}
ptmpnode->pnext = NULL;
return ptmpnode;
}
// 头插入,每次插入的值都在头节点之后
int insertheadlinklist(linknode *phead, int tmpdata)
{
// 插入节点
linknode *ptmpnode = NULL;
ptmpnode = malloc(sizeof(linknode));
if (NULL == ptmpnode)
{
printf("malloc failed!\n");
return -1;
}
ptmpnode->data = tmpdata;
ptmpnode->pnext = phead->pnext;// 将头节点的next指向新的节点的next指向
// 新的节点插在头节点之后,头插入,连接之前插入的数据
phead->pnext = ptmpnode; // 头节点指向新的节点
return 0;
}
int showlinklist(linknode *phead)
{
linknode *ptmp = NULL;
ptmp = phead->pnext;
while (ptmp != NULL)
{
printf("%d ", ptmp->data);
ptmp = ptmp->pnext;
}
printf("\n");
return 0;
}
linknode *findlinklist(linknode *phead, int tmpdata)
{
linknode *ptmpnode = NULL;
ptmpnode = phead->pnext;
while (ptmpnode != NULL)
{
if (ptmpnode->data == tmpdata)
{
return ptmpnode;
}
ptmpnode = ptmpnode->pnext;
}
return NULL;
}
int replacelinklist(linknode *phead, int oldata, int newdata)
{
linknode *ptmpnode = NULL;
ptmpnode = phead->pnext;
while (ptmpnode != NULL)
{
if (ptmpnode->data == oldata)
{
ptmpnode->data = newdata;
}
ptmpnode = ptmpnode->pnext;
}
return 0;
}
// 尾部插入,尾插法
int inserttaillinklist(linknode *phead, int tmpdata)
{
linknode *ptmpnode = NULL;
linknode *plastnode = NULL;
ptmpnode = malloc(sizeof(linknode));
if (NULL == ptmpnode)
{
printf("malloc failed!\n");
return -1;
}
ptmpnode->data = tmpdata;
ptmpnode->pnext = NULL;
plastnode = phead;// 头节点不能变
while (plastnode->pnext != NULL)
{
plastnode = plastnode->pnext;
}
plastnode->pnext = ptmpnode;
return 0;
}
int deletelinklist(linknode *phead, int tmpdata)
{
linknode *ptmpnode = NULL;
linknode *pprenode = NULL;
pprenode = phead;
ptmpnode = phead->pnext;
while (ptmpnode != NULL)
{
if (ptmpnode->data == tmpdata)
{ // 找到位置删除
pprenode->pnext = ptmpnode->pnext;
free(ptmpnode);
ptmpnode = pprenode->pnext;//后移继续遍历
}
else
{
ptmpnode = ptmpnode->pnext;
pprenode = pprenode->pnext;
}
}
return 0;
}
// 二级指针 修改指针的值,一级指针修改地址
int destroylinklist(linknode **pphead)
{
linknode *ptmpnode = NULL;
linknode *pfreenode = NULL;
ptmpnode = pfreenode = *pphead;
while (ptmpnode != NULL)
{
ptmpnode = ptmpnode->pnext;
free(pfreenode);
pfreenode = ptmpnode;
}
*pphead = NULL;
return 0;
}
int bubblesortlinklist(linknode *phead)
{
linknode *ptmpnode1 = NULL;
linknode *ptmpnode2 = NULL;
linknode *pend = NULL;
int tmp = 0;
while (1)
{
ptmpnode1 = phead->pnext;
ptmpnode2 = phead->pnext->pnext;
if (ptmpnode2 == pend)
{
break;
}
while (ptmpnode2 != pend)
{
if (ptmpnode1->data > ptmpnode2->data)
{
tmp = ptmpnode1->data;
ptmpnode1->data = ptmpnode2->data;
ptmpnode2->data = tmp;
}
ptmpnode1 = ptmpnode1->pnext;
ptmpnode2 = ptmpnode2->pnext;
}
pend = ptmpnode1;
}
return 0;
}
int selectsortlinklist(linknode *phead)
{
linknode *pselectnode = NULL;
linknode *pminnode = NULL;
linknode *ptmpnode = NULL;
int tmp;
pselectnode = phead->pnext;
while (pselectnode->pnext != NULL)
{
pminnode = pselectnode;
ptmpnode = pselectnode->pnext;
while (ptmpnode != NULL)
{
if (ptmpnode->data < pminnode->data)
{
pminnode = ptmpnode;
}
ptmpnode = ptmpnode->pnext;
}
if (pminnode != pselectnode)
{
tmp = pminnode->data;
pminnode->data = pselectnode->data;
pselectnode->data = tmp;
}
pselectnode = pselectnode->pnext;
}
return 0;
}
void reverselinklist(linknode *phead)
{
linknode *ptmpnode = NULL;
linknode *ptmpnode1 = NULL;
// 将链表分为两个,第一个链表两个节点,分别是头尾,第二个链表逐个插入
ptmpnode = phead->pnext->pnext;
phead->pnext->pnext = NULL;
while(ptmpnode != NULL)
{
// 取出当前节点,后移
ptmpnode1 = ptmpnode;
ptmpnode = ptmpnode->pnext;
// 当前节点插入正确位置
ptmpnode1->pnext = phead->pnext;
phead->pnext = ptmpnode1;
}
}
int main(void)
{
linknode *plinklist = NULL;
linknode *ptmpnode = NULL;
plinklist = createlinklist();
return 0;
}
单向链表操作
最新推荐文章于 2024-08-09 20:16:54 发布