共享链表

来源:互联网 发布:淘宝公益宝贝有什么用 编辑:程序博客网 时间:2024/04/30 05:51

#include <stdio.h>
#include <stdlib.h>
#define offsetof1(S_TYPE) ((int)&((S_TYPE *)0)->list1)
#define offsetof2(S_TYPE) ((int)&((S_TYPE *)0)->list2)
typedef struct note
{
 struct note *front;
 struct note *next;

}NOTE;
typedef struct _tv
{
 int num;
 NOTE list1;
 NOTE list2;
}TV;

TV * container_of(NOTE *pb,int member)
{
 TV * ret;
 NOTE *mptr = pb;
 if(member==1)
 {
  ret = (TV *)((char *)mptr - offsetof1(TV));
 }
 else if(member==2)
 {
  ret = (TV *)((char *)mptr - offsetof2(TV));
 }
 
 
 return ret;
}
NOTE * insert_link(NOTE *p_head,NOTE *p_new)

 NOTE *p_mov=p_head;
 if(p_head==NULL)
 {
  p_head=p_new;
  (p_head)->next=p_head;
  (p_head)->front=p_head;
  
 }
 else
 { 
  p_new->front=p_mov->front;
  p_new->next=p_mov;
  p_mov->front->next=p_new;
  p_mov->front=p_new;

 }
 return p_head;
 
}

NOTE * init_link(NOTE *p_head,int num)
{
 int i;
 for(i=0;i<num;i++)
 {
  TV *p_new=(TV*)malloc(sizeof(TV));
  p_new->num=i;
  p_head=insert_link(p_head,&(p_new->list1));
 }
 return p_head;
}


void link_print_next(NOTE *head,int flag)
{
 NOTE *p_mov=head;
 TV *tv_p;
 if(head==NULL)
  printf("没有台");
 else
 {
  while(p_mov->next!=head)
  {
   tv_p=container_of(p_mov,flag);
   printf("tv_num=%d\n",tv_p->num);
   p_mov=p_mov->next;
  }
  tv_p = container_of(p_mov,flag);
  printf("tv_num=%d\n",tv_p->num);
  printf("\n\n\n");
 }
}

void link_print_front(NOTE *head,int flag)
{
 NOTE *p_mov=head;
 TV *tv_p;
 if(head==NULL)
  printf("没有台");
 else
 {
  while(p_mov->front!=head)
  {
   tv_p=container_of(p_mov,flag);
   printf("tv_num=%d\n",tv_p->num);
   p_mov=p_mov->front;
  }
  tv_p = container_of(p_mov,flag);
  printf("tv_num=%d\n",tv_p->num);
  printf("\n");
 }
}

NOTE *delet_tv(NOTE **p_head,NOTE *tv_now)

 
 NOTE*temp;
 if(*p_head==tv_now)
 {
  
  *p_head=tv_now->next;
  (*p_head)->front=tv_now->front;
  tv_now->front->next=*p_head;
 }
 else
 {
  tv_now->front->next=tv_now->next;
  tv_now->next->front=tv_now->front;
 }
 TV *tv_p=container_of(tv_now,1);
 printf("the delete num is %d\n",tv_p->num);
 temp=tv_now->next;
 free(tv_p);
 return temp;
}

void link_tv_save(NOTE **p_head2,NOTE *p_new)
{

  TV* p_mov=container_of(p_new,1);
  printf("the cellect num is %d\n",p_mov->num);
 *p_head2=insert_link(*p_head2,&(p_mov->list2));
}


int main()
{
 int num,m;

 NOTE *tv_head=NULL,*tv_now,*tv_head2=NULL;

 printf("初始化电台\n");

 scanf("%d",&num);

 tv_head=init_link(tv_head,num);

 link_print_next(tv_head,1);
 link_print_front(tv_head,1);
  tv_now =tv_head;
 while(1)
 {
  printf("\n1:下一个台,2:上一个台,3删除当前台,4收藏,5退出");
  scanf("%d",&num);
  TV *tv_p;
  switch(num)
  {
   case 1:
     tv_now=tv_now->next;
     tv_p=container_of(tv_now,1);
     printf("tv_num=%d\n",tv_p->num);
     break;
   case 2:
     tv_now=tv_now->front;
     tv_p=container_of(tv_now,1);
     printf("tv_num=%d\n",tv_p->num);
     break;
    case 3:
     tv_now=delet_tv(&tv_head,tv_now);
     printf("delete in there\n");
     link_print_next(tv_head,1);
     break;
   case 4:
     link_tv_save(&tv_head2,tv_now);
     link_print_next(tv_head2,2);
     break;
   case 5:
     exit(0);
     break;
  }
 }

 return 0;
}

0 0