day-21 内核链表以及栈

打印 上一主题 下一主题

主题 1026|帖子 1026|积分 3078

1.昨日作业

1.删除指定节点

找到删除就完事了,双向可以停在删除处。
  1. /****************************
  2. * 功能:删除指定结点(通过姓名)
  3. * 参数:phead;oldname;
  4. * 返回:成功0,失-1;
  5. * *************************/
  6. int delete_specified_node(dou_node *phead,char *oldname)
  7. {
  8.     if(NULL == phead)
  9.     {
  10.         printf("phea is NULL");
  11.             return -1;
  12.     }
  13.     dou_node *p = phead->pnext;
  14.     while(NULL != p)
  15.     {
  16.         if(strcmp(p->data.name,oldname)==0)
  17.         {
  18.             dou_node *q = p->pnext;
  19.             p->ppre->pnext = q;
  20.             q->ppre = p->ppre;
  21.             free(p);
  22.             return 0;
  23.         }
  24.         p = p->pnext;
  25.     }
  26.     return -1;
  27. }
复制代码
2.内核链表

内核链表将节点以及要储存的数据分脱离来,节点的使用函数不因数据范例的改变而必要重写。
1.klist.h

声明节点的范例,以及节点使用的函数
  1. #ifndef __KLIST_H__
  2. #define __KLIST_H__
  3. typedef struct knode
  4. {
  5.     struct knode *ppre;
  6.     struct knode *pnext;
  7. }Knode;
  8. extern Knode * creat_klist();
  9. extern int insert_head_klist(Knode *phead ,Knode *pinsert);
  10. extern void list_for_each(Knode *phead,void (*pfun)(Knode *));
  11. extern int delete_tail_klist(Knode*phead);
  12. extern int delete_head_klist(Knode*phead);
  13. extern void destroy_klist(Knode * phead);
  14. extern int insert_tail_klist(Knode *phead,Knode *pinsert);
  15. #endif
复制代码
2.flight.h

声明数据结构体范例,
  1. ##ifndef __FLIGHT_H__
  2. #define __FLIGHT_H__
  3. #include "klist.h"
  4. struct passager
  5. {
  6.     Knode node;
  7.     char name[32];
  8.     int flt_num;
  9.     int sit_num;
  10.     char hea_card;
  11. };
  12. extern struct passager* creat_passager(char *name,int flt_num, int sit_num,char hea_card);
  13. extern void print_passager(Knode *p);
  14. #endif
复制代码
2 .klist.c

1.创建节点

  1. Knode *creat_klist()
  2. {
  3.     Knode *phead = NULL;
  4.     phead = malloc(sizeof(Knode));
  5.     if(NULL == phead)
  6.     {
  7.         printf("malloc fail\n");
  8.         return NULL;
  9.     }
  10.     phead->ppre = NULL;
  11.     phead->pnext = NULL;
  12.     return phead;
  13. }
复制代码
2.前插

逻辑同双向链表的前插,但是呢插得是数据中的节点,故在main函数中应先定义数据结构体变量,定义的时候不用管节点成员。传参传结构体成员如下所示
  1.         struct passager *p1 = creat_passager("zhangsan",2024,1,'r');   
  2.     struct passager *p2 = creat_passager("lisi",2024,2,'g');
  3.     struct passager *p3 = creat_passager("wanger",2024,3,'y');
  4.    
  5.     insert_tail_klist(phead,&(p1->node));
  6.     insert_tail_klist(phead,&(p2->node));
  7.     insert_tail_klist(phead,&(p3->node));
复制代码
插入分两种情况,空的和非空
  1. int insert_head_klist(Knode *phead , Knode *pinsert)
  2. {
  3.     pinsert->pnext = phead->pnext;
  4.     if(phead->pnext != NULL)
  5.     {
  6.         phead->pnext->ppre = pinsert;
  7.     }
  8.     pinsert->ppre = phead;
  9.     phead->pnext = pinsert;
  10.     return 0;
  11. }
复制代码
3.后插

后插特别部分和前插一样,但是有个细节是查完之后pinsert->pnext = NULL;
  1. int insert_klist_tail(KNode *phead, KNode *pnode)
  2. {
  3.         if (NULL == phead || NULL == pnode)
  4.                 return -1;
  5.        
  6.         KNode *p = phead;
  7.         while (p->pnext != NULL)
  8.         {
  9.                 p = p->pnext;
  10.         }
  11.        
  12.         p->pnext = pnode;
  13.         pnode->ppre = p;
  14.         pnode->pnext = NULL;
  15.        
  16.         return 0;
  17. }
复制代码
4.遍历(重重重点)

到达低耦合的效果
第一种

通过函数指针形成回调函数 。到达差别的数据范例也可以通过一个遍历函数完成便利,只必要传递差别的函数指针就行。
  1. void list_for_each(Knode *phead, void (*pfun)(Knode *))
  2. {
  3.     if(phead ==NULL || NULL == pfun)
  4.         return;
  5.     Knode *p = phead->pnext;
  6.     while(NULL  !=p)
  7.     {
  8.         pfun(p);
  9.         p = p->pnext;
  10.     }
  11.     printf("\n");
  12. }
复制代码
回调函数
先强转在访问
  1. void print_passager(Knode *pnode)
  2. {
  3.     struct passager *p = (struct passager *)pnode;
  4.     printf("%s %d %d %c\n",p->name,p->flt_num,p->sit_num,p->hea_card);
  5. }
复制代码
main函数调用
  1. list_for_each(phead,print_passager);
复制代码
第二种

通过带参宏的形式,去访问结构体成员
.h中声明
  1. #define klist_for_each(pos, head)                                        \
  2.         for (pos = (head)->pnext; pos != NULL; pos = pos->pnext)
复制代码
main’函数中直接使用,先强转随便访问结构体;
  1. klist_for_each(ptmp, phead)
  2. {
  3.         struct passager *p = (struct passager *)ptmp;
  4.        
  5. }
复制代码
5.删除销毁等同双向,本质是双向链表,把节点放在结构体首个成员。结构体地点等于节点地点。

3.栈

1.体系栈和数据结构中的栈的区别


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表