环形链表.h
#include<stdio.h>
#include<stdlib.h>
typedef struct Linknode
{
int data;
struct Linknode *pNext;
}node, *PNODE;//node结构体变量,PNODE代表一个指针指向结构体
PNODE addback(PNODE phead, int data);//尾部插入
PNODE addfront(PNODE phead, int data);
PNODE changedata(PNODE phead, int data, int newdata);
PNODE deletedata(PNODE phead, int data);//删除
PNODE insertback(PNODE phead, int data, int newdata);
PNODE inserthead(PNODE phead, int data, int newdata);
PNODE findfirst(PNODE phead, int data);//查找的数据
void showall(PNODE phead);
环形链表.c
#include"环形链表.h"
PNODE addback(PNODE phead, int data)//尾部插入
{
PNODE pnew = malloc(sizeof(node));
pnew->data = data;//分配空间
if (phead==NULL)
{
phead = pnew;
pnew->pNext = phead;//一个节点的环
}
else
{
//循环到尾部
PNODE p = phead;
while (p->pNext!=phead)
{
p = p->pNext;
}
p->pNext = pnew;//连接上新的
pnew->pNext = phead;//链道开头
}
return phead;
}
PNODE addfront(PNODE phead, int data) //头部插入
{
PNODE pnew = malloc(sizeof(node));
pnew->data = data;
if (phead==NULL)
{
phead = pnew;
pnew->pNext = phead;
}
else
{
PNODE p = phead;
while (p->pNext!=phead)
{
p = p->pNext;
}
p->pNext = pnew;
pnew->pNext = phead;
phead = pnew;
}
return phead;
}
void showall(PNODE phead) //展示
{
if (phead==NULL)
{
return;
}
else if (phead->pNext==phead)
{
printf("%d %p %p\n", phead->data, phead, phead->pNext);//打印一个节点的情况
}
else
{
PNODE p = phead;
while (p->pNext!=phead)
{
printf("%d %p %p\n", p->data, p, p->pNext);
p = p->pNext;//循环
}
printf("%d %p %p\n", p->data, p, p->pNext);
}
}
PNODE findfirst(PNODE phead, int data)//查找
{
if (phead==NULL)
{
return NULL;
}
else if(phead->pNext==phead)
{
if (phead->data==data)
{
return phead;
}
else
{
return NULL;
}
}
else
{
PNODE p = phead;
while (p->pNext!=phead)
{
if (p->data==data)
{
return p;
}
p = p->pNext;//循环
}
if (p->data==data)
{
return p;
}
return NULL;
}
}
PNODE deletedata(PNODE phead, int data)//删除
{
PNODE p1 = NULL;
PNODE p2 = NULL;
p1 = phead;
if (p1->data==data)
{
p2 = phead;
while (p1->pNext!=phead)
{
p1 = p1->pNext;
}
p1->pNext = phead->pNext;
free(p2);
phead = p1->pNext;
return phead;
}
else
{
while (p1->pNext!=phead)
{
if (p1->data==data)
{
p2->pNext = p1->pNext;
free(p1);
return phead;
}
else
{
p2 = p1;
p1 = p1->pNext;
}
}
if (p1->data==data)
{
p2->pNext = p1->pNext;
free(p1);
return phead;
}
}
}
PNODE changedata(PNODE phead, int data,int newdata) //修改
{
if (phead==NULL)
{
printf("changedata error");
}
else if (phead->pNext == phead)
{
if (phead->data==data)
{
phead->data = newdata;
}
else
{
printf("changedata error");
}
}
else
{
PNODE p = phead;
while (p->pNext!=phead)
{
if (p->data==data)
{
p->data = newdata;
}
p = p->pNext;
}
if (p->data == data)
{
p->data = newdata;
}
}
return phead;
}
PNODE insertback(PNODE phead, int data,int newdata) //后插
{
PNODE pnew = malloc(sizeof(node));
pnew->data = newdata;
if (phead->pNext==phead)
{
if (phead->data==data)
{
phead->pNext = pnew;
pnew->pNext = phead;
return phead;
}
}
else
{
PNODE p = phead;
while (p->pNext!=phead)
{
if (p->data==data)
{
pnew->pNext = p->pNext;
p->pNext = pnew;
return phead;
}
else
{
p = p->pNext;
}
}
if (p->data == data)
{
pnew->pNext = p->pNext;
p->pNext = pnew;
return phead;
}
}
}
PNODE inserthead(PNODE phead, int data, int newdata)//前插
{
PNODE pnew = malloc(sizeof(node));
pnew->data = newdata;
if (phead->pNext==phead)
{
if (phead->data==data)
{
pnew->pNext = phead;
phead->pNext = pnew;
phead = pnew;
return phead;
}
}
else
{
PNODE p = phead;
if (p->data==data)
{
while (p->pNext!=phead)
{
p = p->pNext;
}
p->pNext = pnew;
pnew->pNext = phead;
phead = pnew;
return phead;
}
else
{
PNODE p1=phead,p2 = NULL;
while (p1->pNext != phead)
{
if (p1->data == data)
{
pnew->pNext = p1;
p2->pNext = pnew;
return phead;
}
else
{
p2 = p1;
p1 = p1->pNext;
}
}
if (p1->data == data)
{
pnew->pNext = p1;
p2->pNext = pnew;
return phead;
}
}
}
}
main.c
#include"环形链表.h"
void main()
{
//printf("%d,%d", sizeof(node), sizeof(PNODE));
PNODE phead = NULL;//头结点
for (int i = 0; i < 10; i++)
{
phead = addback(phead, i);//插入数据
}
phead = addfront(phead, 11);
phead= changedata(phead, 8,12);
phead = deletedata(phead, 12);
phead = insertback(phead, 7,12);
phead = inserthead(phead, 11, 99);
phead = inserthead(phead, 99, 100);
phead = inserthead(phead, 9, 101);
showall(phead);
system("pause");
}