looplink.h
#ifndef __LOOPLINK_H__
#define __LOOPLINK_H__
typedef int datatype;
typedef struct Node
{
union
{
int len;
datatype data;
};
struct Node *next;
}looplink;
looplink *list_create();
int list_empty(looplink*);
int list_insert_head(looplink*,datatype);
int list_delete_head(looplink*);
void list_show(looplink*);
looplink* list_head_kill(looplink*);
void list_show2(looplink*);
int list_delete2(looplink*);
#endif
looplink.c
looplink* list_create()
{
looplink *L=(looplink*)malloc(sizeof(looplink));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}
memset(L,0,sizeof(looplink));
L->len=0;
L->next=L;
printf("创建成功\n");
return L;
}
int list_empty(looplink*L)
{
if(NULL==L)
{
printf("链表不合法\n");
return 0;
}
return L->next==L;
}
int list_insert_head(looplink*L,datatype e)
{
looplink *p=(looplink*)malloc(sizeof(looplink));
if(NULL==L||NULL==p)
{
printf("头插失败\n");
return 0;
}
p->next=L->next;
L->next=p;
p->data=e;
L->len++;
printf("头插成功\n");
return 1;
}
void list_show(looplink*L)
{
if(NULL==L||list_empty(L))
{
printf("遍历失败\n");
return;
}
printf("链表中的元素如下:\n");
looplink *p=L->next;
while(p!=L)
{
printf("%d\n",p->data);
p=p->next;
}
}
int list_delete_head(looplink*L)
{
if(NULL==L||list_empty(L))
{
printf("头删失败\n");
return 0;
}
looplink *p=L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
printf("头删成功\n");
return 1;
}
looplink* list_head_kill(looplink*L)
{
if(L==NULL||list_empty(L))
{
printf("去头失败\n");
return 0;
}
looplink *p=L->next;
while(p->next!=L)
{
p=p->next;
}
p->next=L->next;
free(L);
L=NULL;
return p->next;
}
void list_show2(looplink* H)
{
looplink *p=H;
printf("链表中的元素如下:\n");
do
{
printf("%d\n",p->data);
p=p->next;
}
while(p!=H);
}
int list_delete2(looplink*L)
{
if(NULL==L)
{
printf("链表不合法\n");
return 0;
}
looplink *p=L->next;
L->next=p->next;
free(p);
p=NULL;
printf("删除成功\n");
return 1;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "looplink.h"
int main(int argc, const char *argv[])
{
looplink *L=list_create();
looplink *S=list_create();
for(int i=8;i>=1;i--)
{
list_insert_head(L,i);
}
list_show(L);
looplink* H=list_head_kill(L);
list_show2(H);
looplink* q=H;
for(int j=0;j<8;j++)
{
for(int i=0;i<2;i++)
{
q=q->next;
}
list_insert_head(S,q->next->data);
list_delete2(q);
q=q->next;
}
list_show(S);
return 0;
}