1.头文件
#include<stdio.h>
#include<stdlib.h>
typedef struct Link{
int data;
struct Link *next;
}link;
2.功能函数
link *link_init(void)
{
link *p = (link *)malloc(sizeof(link));
p->next = p;
return p;
}
//头插
void link_insert(link *head,int value)
{
link *node = (link *)malloc(sizeof(link));
node->next = head->next;
head->next = node;
node->data = value;
}
//尾插
void link_Insert(link *head,int value)
{
link *node = (link *)malloc(sizeof(link));
link *temp = head;
while(temp->next != head)
{
temp = temp->next;
}
temp->next = node;
node->data = value;
node->next = head;
}
//删除
void link_del(link *head,int value)
{
int ret = link_find(head,value);
if(ret == -1)
{
printf("不存在这个数\n");
return;
}
link *temp = head;
link *q;
int i;
for(i = 0;i < ret;i++)
{
if(temp->next->data == value)
{
q = temp->next;
temp->next = temp->next->next;
free(q);
break;
}else
{
temp = temp->next;
}
}
}
//修改
void link_change(link *head,int old,int new)
{
int ret = link_find(head,old);
if(ret == -1)
{
printf("不存在这个数\n");
return;
}
link *temp = head->next;
int i;
for(i = 0;i < ret;i++)
{
if(temp->data == old)
{
temp->data = new;
}else
{
temp = temp->next;
}
}
}
//查找
int link_find(link *head,int value)
{
link *temp = head->next;
int ret = 1;
while(temp != head)
{
if(temp->data == value)
{
break;
}else
{
temp = temp->next;
ret++;
}
}
if(temp == head)
{
return -1;
}else
{
return ret;
}
}
//逆转
void link_ni(link *head)
{
link *newhead = head->next;
link *q;
head->next = NULL;
while(newhead != NULL)
{
q = newhead;
link_insert(head,q->data);
newhead = newhead->next;
free(q);
}
}
//中间插入
void link_zjinsert(link *head,int value)
{
int ret = link_length(head);
int x;
printf("请选择插入数据的位置\n");
scanf("%d",&x);
if(x > ret && x < 0)
{
printf("插入位置不存在\n");
return;
}
link *temp = (link *)malloc(sizeof(link));
temp->data = value;
link *q;
int i;
for(i = 0;i < x;i++)
{
if(i == x-1)
{
temp->next = q->next;
q->next = temp;
}else
{
q = q->next;
}
}
}
//链表长度
int link_length(link *head)
{
link *temp = head->next;
int ret = 1;
while(temp != head)
{
temp = temp->next;
ret++;
}
return ret;
}
//找n出局
void link_n(link *head,int n)
{
link *temp = head->next;
link *q;
int i = 1;
while(head->next->next != head)
{
if(temp == head)
{
temp = temp->next;
}
else
{
temp = temp->next;
i++;
}
if((i % n) == 0)
{
q = temp;
temp = temp->next;
free(q);
i++;
}
}
}
//打印
void link_show(link *head)
{
link *temp = head->next;
while(temp != head)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n");
}
3主函数
int main(void)
{
link *head = link_init();
link_insert(head,1);
link_insert(head,2);
link_insert(head,3);
link_insert(head,4);
link_insert(head,5);
link_show(head);
link_Insert(head,10);
link_Insert(head,9);
link_Insert(head,8);
link_Insert(head,7);
link_Insert(head,6);
link_show(head);
/*
printf("请输入要查找的数\n");
int n;
scanf("%d",&n);
int ret = link_find(head,n);
if(ret == -1)
{
printf("查找失败\n");
}else
{
printf("在链表第%d位\n",ret);
}
printf("请输入要删除的数\n");
int a;
scanf("%d",&a);
link_del(head,a);
link_show(head);
int b,c;
printf("请输入要修改的数,和更新的数\n ");
scanf("%d%d",&b,&c);
link_change(head,b,c);
link_show(head);
printf("链表逆转\n");
link_ni(head);
link_show(head);
printf("中间插入\n");
link_zjinsert(head,29);
link_show(head);
*/
link_n(head,3);
link_show(head);
return 0;
}