1 link2.h
#ifndef _LINK2_H
#define _LINK2_H
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE,*linknode;
linknode createNode_2();
linknode insertLink_2(linknode head,linknode p);
linknode insertLink_2h(linknode head,linknode p);
void showLink_2(linknode head);
int lengthLink_2(linknode head);
linknode searchLink_2(linknode head,int data);
linknode deleteLink_2(linknode hea,int data);
linknode deleteLink_h(linknode hea,int data);
void freeLink_2(linknode head);
#endif
2 link2.c
#include"link2.h"
linknode createNode_2()
{
linknode p=(linknode)malloc(sizeof(NODE));
if(p==NULL)
{
printf("申请空间失败:\n") ;
return NULL;
}
printf("请输入结点信息:\n");
scanf("%d",&p->data);
p->next=NULL;
return p;
}
linknode insertLink_2(linknode head,linknode p)
{
linknode tail=head;
if(head==NULL)
{
head=p;
head->next=p;
return head;
}
while(tail->next!=head)
//tail->next!=NULL
{
tail=tail->next;
//指针后移
}
tail->next=p;
p->next=head;//尾结点指向头结点
return head;
}
linknode insertLink_2h(linknode head,linknode p)
{
linknode tail=head;
if(head==NULL)
{
head=p;
head->next=p;
return head;
}
// while(tail!=NULL)
while(tail->next!=head)
{
tail=tail->next;
}
p->next=head;
head=p;
tail->next=p;
return head;
}
void showLink_2(linknode head)
{
linknode p=head;
if(head==NULL)
{
printf("空链表\n");
return ;
}
while(1)//
{
printf("first=%d ",p->data);
p=p->next;
if(p==head)//证明为循环链表,打印第二次
{
printf("\n");
while(1)
{
printf("second=%d ",p->data);
p=p->next;
if(p==head)
break;
}
break;
}
}
printf("\n");
}
int lengthLink_2(linknode head)
{
int len=0;
linknode p=head;
if(head==NULL)
return len;
while(1)
{
p=p->next;
len++;
if(p==head)
{
return len;
}
}
}
linknode searchLink_2(linknode head,int data)
{
linknode p=head;
if(head==NULL)
return NULL;
while(1)
{
if(p->data==data)
return p;
p=p->next;
if(p==head)
return NULL;
}
}
//单向循环链表的删除
linknode deleteLink_2(linknode head,int data)
{
//增加表头
linknode p=(linknode)malloc(sizeof(NODE));
linknode ph=head;
p->next=head;
linknode s,tmp;
if(p->next==NULL)//空链表
{
free(p);
return NULL;
}
if(p->next->data==data)
{
if(p->next->next==head)
//第一个结点为删除的数据且只有1个结点情况
{
free(head);
free(p);
return NULL;
}
else//第一个结点为删除数据,至少2个结点
{
s=p->next;
p->next=s->next;
free(s);
ph=p->next;
s=p->next;
while(1)
{
if(s->next==head)
{
s->next=ph;
free(p);
return ph;
}
else
s=s->next;
}
}
}
//删除其他的结点情况
else
{
if(p->next->next==head)
//只有一个结点且数据不为删除的数据
{
free(p);
return head;
}
//删除其他结点
tmp=p;//保存表头指针
while(1)
{
p=p->next;
if(p->next->data==data)
{
s=p->next;
p->next=s->next;
free(s);
free(tmp);
return head;
}
}
}
}
void freeLink_2(linknode head)
{
linknode p=head;
linknode s=head;
if(head==NULL)
return;
while(1)
{
if(p->next==head)
{
free(p);
return;
}
else
{
s=s->next;
free(p);
p=s;
}
}
}
3 main
#include"link2.h"
int main()
{
int i,len,data;
linknode p,head=NULL;
for(i=0;i<5;i++)
{
p=createNode_2();
if(p==NULL)
{
printf("结点创建失败:\n");
continue;
}
head=insertLink_2(head,p);
}
showLink_2(head);
len=lengthLink_2(head);
printf("len=%d\n",len);
printf("请输入查找的数据:\n");
scanf("%d",&data);
p=searchLink_2(head,data);
if(p==NULL)
printf("没有找到该数据\n");
else
printf("%d\n",p->data);
printf("请输入删除的数据:\n");
scanf("%d",&data);
head=deleteLink_2(head,data);
showLink_2(head);
freeLink_2(head);
return 0;
}