链表的使用

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

#define uint unsigned int
#define uchar unsigned char
typedef long uint l_uint;
#define NAME_LENGTH (32)
typedef enum BOOL
{
 FALSE,
 TRUE,
}BOOL;
#define INVALID_INPUT (-2)
#define ZTE_OK (0)
#define ZTE_ERR (-1)
#define ZTE_DEF (1)
#define SEX_ENUM_NUM (3)
#define PUBLIC_ENUM_NUM (5)

#define point_param_check(input)\
do\
{\
 if(NULL == input)\
 return INVALID_INPUT;\
}while(0);

/* 定义双向链表结构体,其中包含一个指向前一个和后一个链表结点的指针 */
struct list_head
{
 struct list_head *next,*prev;
};

/* 定义链表初始化函数,将next prev指针均指向链表头结点 */
#define LIST_HEAD_INIT(ptr)\
do\
{\
 (ptr)->next = (ptr);\
 (ptr)->prev = (ptr);\
}while(0);

/* 定义遍历链表时使用的获取对象指针的函数 */
#define list_entry(ptr, type, member)\
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

/* 遍历链表中每一个结点的函数head 为链表头结点,
 * pos n 为struct list_head 类型的变量使用的时候需要在函数内定义 */
#define list_for_each_entry(pos, n, head)\
for(pos = (head)->next,n = pos->next;pos !=(head);\
 pos = n,n = pos->next)

/* 链表判空函数,非空返回TRUE  */
static inline BOOL list_isnot_empty(struct list_head *list)
{
 if(list->next==list)
 return TRUE;
 else
 return FALSE;
}

/* 将一个结点添加到链表的函数 */
static inline void _list_add(struct list_head *new,
        struct list_head *prev,
        struct list_head *next)
{
 next->prev = new;
 new->next = next;
 new->prev = prev;
 prev->next = new;
}

/* 删除一个链表结点的函数 */
static inline void _list_del(struct list_head *prev,
        struct list_head *next)
{
 prev->next = next;
 next->prev = prev;
}

/* 将一个结点添加到链表头结点之后的函数 */
static inline void list_head_later_add(struct list_head *head,
            struct list_head *new)
{
 _list_add(new,head,head->next);
}

/* 将一个结点添加到链表的头结点之前的函数 */
static inline void list_head_prev_add(struct list_head *head,
           struct list_head *new)
{
 _list_add(new,head->prev,head);
}

/* 删除链表中某一个结点的函数 */
static inline void list_del(struct list_head *entry)
{
 _list_del(entry->prev,entry->next);
 entry->prev = (void *)0;
 entry->next = (void *)0;
}

/* 移动某一个结点到链表头后面 */
static inline void list_move_head_later(struct list_head *list,
          struct list_head *head)
{
 _list_del(list->prev,list->next);
 list_head_later_add(head,list);
}

/* 移动某一个结点到链表头前面 */
static inline void list_move_head_prev(struct list_head *list,
            struct list_head *head)
{
 _list_del(list->prev,list->next);
 list_head_prev_add(head,list);
}

/* 链表拆分函数,将一个链表拆分成两个链表 */
static inline void _list_splice(struct list_head *list,
        struct list_head *head)
{
 struct list_head *first = list->next;
 struct list_head *last = list->prev;
 struct list_head *at = head->next;

 first->prev = head;
 head->next = first;
 last->next = at;
 at->prev = last;
}

/* 链表合并函数 */
static inline void list_splice(struct list_head *list,
          struct list_head *head)
{
 if(!list_isnot_empty(list))
 _list_splice(list,head);
}

/* 链表合并并初始化空链表的函数 */
static inline void list_splice_init(struct list_head *list,
         struct list_head *head)
{
 if(!list_isnot_empty(list))
 {
  _list_splice(list,head);
  LIST_HEAD_INIT(list);
 }
}


typedef enum SEX_E
{
 Man,
 Woman,
 Invalid_sex,

}SEX_E;

typedef enum PUBLIC_E
{
 Development,
 Testing,
 Human_resource,
 Accounting,
 Invalid_public,

}PUBLIC_E;
typedef struct SEX_INFO_T
{
 SEX_E sex;
 char despict[NAME_LENGTH];

}SEX_INFO_t;
typedef struct PUBLIC_INFO_T
{
 PUBLIC_E public;
 char despict[NAME_LENGTH];

}PUBLIC_INFO_t;
const SEX_INFO_t g_sex_info_table[SEX_ENUM_NUM]=
{
 {Man,"Man"},
 {Woman,"Woman"},
 {Invalid_sex,"Invalid_sex"}
};
const PUBLIC_INFO_t g_public_info_table[PUBLIC_ENUM_NUM]=
{
 {Development,"Development"},
 {Testing,"Testing"},
 {Human_resource,"Human_resource"},
 {Accounting,"Accounting"},
 {Invalid_public,"Invalid_public"}
};
typedef struct COMPANY_INFO_T
{
 char Name[NAME_LENGTH];
 SEX_E Sex;
 PUBLIC_E Public;
 l_uint Numbers;
}COMPANY_INFO_t;

typedef struct STORE_MEMBERS_INFO_T
{
 COMPANY_INFO_t Member_info;
 struct list_head list;

}STORE_MEMBERS_INFO_t;

#define MAXNUM (1024)
STORE_MEMBERS_INFO_t g_members_info_zte[MAXNUM];

struct list_head *list_head_get(int nums)
{
 struct list_head *head = NULL;
 if(nums<MAXNUM)
 {
  head = &g_members_info_zte[nums].list;
 }
 return head;
}
void init(void)
{
 uint num_loop = 0;

 memset(g_members_info_zte, 0, MAXNUM*sizeof(STORE_MEMBERS_INFO_t));
 for(num_loop=0;num_loop<MAXNUM;num_loop++)
 {
  LIST_HEAD_INIT(list_head_get(num_loop));
 }
 return;
}
int add_mem_info(uint num)
{
 int ret = ZTE_DEF;
 STORE_MEMBERS_INFO_t *mem_info = NULL;
 struct list_head *head = NULL;

 if(num>=MAXNUM)
 {
  printf("invalid parmers!\n");
  return INVALID_INPUT;
 }

 mem_info = (STORE_MEMBERS_INFO_t *)malloc(sizeof(STORE_MEMBERS_INFO_t));
 if(mem_info == NULL)
 {
  perror("malloc  fail\n");
  return ZTE_ERR;
 }
 memset(mem_info, 0,sizeof(STORE_MEMBERS_INFO_t));

 strcpy(mem_info->Member_info.Name,"liqiang");
 //memcpy(mem_info->Member_info.Name,"liqiang",strlen("liqiang"));
 mem_info->Member_info.Sex = Man;
 mem_info->Member_info.Public = Development;
 mem_info->Member_info.Numbers =10198838;

 head = list_head_get(num);
 point_param_check(head);
 if((NULL == mem_info->list.next)&&(NULL == mem_info->list.prev))
 {
  list_head_prev_add(head,&(mem_info->list));
  ret = ZTE_OK;
 }
 else
 {
  list_move_head_prev(&(mem_info->list),head);
  ret = ZTE_OK;
 }
 return ret;

}
int del_mem_info(uint num)
{
 int ret = ZTE_DEF;
 struct list_head *head = NULL;
 struct list_head *pos = NULL;
 struct list_head *npos = NULL;
 STORE_MEMBERS_INFO_t *mem_info = NULL;

 if(MAXNUM <= num)
 {
  printf("invalid params!\n");
  return INVALID_INPUT;
 }
 head = list_head_get(num);
 point_param_check(head);
 list_for_each_entry(pos,npos,head)
 {
  mem_info = list_entry(pos,STORE_MEMBERS_INFO_t,list);
  if(NULL != mem_info)
  {
   printf(" Member_info.Name:%s\n Member_info.Sex:%s\n Member_info.Public:%s\n Member_info.Numbers:%ld\n",
       mem_info->Member_info.Name,g_sex_info_table[mem_info->Member_info.Sex].despict,g_public_info_table[mem_info->Member_info.Public].despict,mem_info->Member_info.Numbers);
   list_del(&(mem_info->list));
   free(mem_info);
   ret = ZTE_OK;
  }
 }

 return ret;
}
int main(int argc, char *argv[])
{
 int ret = 0;
 pid_t p_pid = 0;
 pid_t c_pid = 0;
 pid_t pid = 0;

 init();
 pid = fork();
 if(pid<0)
 {
  perror("fork error!\n");
  exit(1);
 }
 else if(pid>0)
 {
  p_pid = getpid();
  printf("this is parent process![p_pid:%d]\n",p_pid);
//  sleep(5);
  #if 0
  ret = del_mem_info(0);
  if(ZTE_OK == ret)
  {
   printf("del mem_info success!\n");
  }
  else
  {
   printf("del mem_info fail [ret:%d]\n",ret);
   if(INVALID_INPUT == ret)
   {
    printf("input error!\n"); 
   }
   if(ZTE_ERR == ret)
   {
    printf("malloc error!\n");
   }
  }
  #endif
  waitpid(c_pid,NULL,0);
  exit(0);
 }
 else if(pid == 0)
 {
  c_pid = getpid();
  printf("this is child process![c_pid:%d]\n",c_pid);
  ret = add_mem_info(0);

  if(ZTE_OK == ret)
  {
   printf("add mem_info success!\n");
  }
  else
  {
   printf("add mem_info fail[ret:%d]\n",ret);
   if(INVALID_INPUT == ret)
   { 
    printf("del mem_info fail!\n");
   }
   if(ZTE_ERR == ret)
   { 
    printf("malloc error!\n");
   }
  }
  ret = del_mem_info(0);
  if(ZTE_OK == ret)
  {
   printf("del mem_info success!\n");
  }
  else
  {
   printf("del mem_info fail [ret:%d]\n",ret);
   if(INVALID_INPUT == ret)
   {
    printf("input error!\n"); 
   }
   if(ZTE_ERR == ret)
   {
    printf("malloc error!\n");
   }
  }
  exit(0);
 }

 return ZTE_OK;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值