Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1176913
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: C/C++

2015-12-02 14:57:08


点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. #define NAMELEN 32
  5. #define    ADDRLEN 128

  6. /*单链表的虚拟实现*/
  7. typedef struct lnode
  8. {
  9.     char name[NAMELEN];
  10.     char addr[ADDRLEN];
  11.     char sex;
  12.     float score;
  13.     int id;
  14.     struct lnode * next;
  15. }NODE;

  16. typedef NODE * NodePtr;

  17. int Initlist(NodePtr * headptr);
  18. int CreatNode(NodePtr * nodeptr, char * name, char * addr, char sex, float score, int id);
  19. int Lenlist(NodePtr headptr);
  20. int GetNode(NodePtr headptr, int num, NodePtr * nodeptr);
  21. int AddNode(NodePtr headptr, NodePtr nodeptr);
  22. int PrintAllNode(NodePtr headptr);
  23. int InsertNode(NodePtr headptr, int num, NodePtr nodeptr);
  24. int DeleteNode(NodePtr headptr, int num);
  25. int UnionList(NodePtr headptr1, NodePtr headptr2);
  26. int SortNode(NodePtr headptr);
  27. int SortNode2(NodePtr headptr);

  28. int main(int argc, char ** argv)
  29. {
  30.     printf("*********单向循环链表的操作********\n");

  31.     NodePtr headptr = NULL;
  32.     Initlist(&headptr); /*需传指针的地址,才能改变指针变量的值*/
  33.     
  34.     NodePtr nodeptr = NULL;
  35.     CreatNode(&nodeptr, "王贤才", "湖北", 'm', 100.00, 1);
  36.     AddNode(headptr, nodeptr);
  37.     CreatNode(&nodeptr, "张秋苹", "湖北", 'w', 100.00, 2);
  38.     AddNode(headptr, nodeptr);
  39.     CreatNode(&nodeptr, "程序员", "上海", 'm', 100.00, 3);
  40.     AddNode(headptr, nodeptr);
  41.     CreatNode(&nodeptr, "我老婆", "上海", 'w', 100.00, 4);
  42.     AddNode(headptr, nodeptr);
  43.     CreatNode(&nodeptr, "王贤才", "上海", 'm', 99.00, 6);
  44.     AddNode(headptr, nodeptr);
  45.     printf("**************\n");
  46.     PrintAllNode(headptr);
  47.     
  48.     NodePtr getnodeptr = NULL;
  49.     int num = 3;
  50.     GetNode(headptr, num, &getnodeptr);
  51.     printf("*************取得第[%d]个元素如下:************\n", num);
  52.     printf(" id =[%d]\n name =[%s]\n addr =[%s]\n sex =[%c]\n score=[%.2f]\n", getnodeptr->id, getnodeptr->name, getnodeptr->addr, getnodeptr->sex, getnodeptr->score);
  53.     
  54.     CreatNode(&nodeptr, "我老子", "上海", 'm', 98.00, 5);
  55.     num = 6;
  56.     InsertNode(headptr, num, nodeptr);
  57.     PrintAllNode(headptr);
  58.     /*
  59.     num = 4;
  60.     DeleteNode(headptr, num);
  61.     PrintAllNode(headptr);
  62.     */
  63.     
  64.     NodePtr headptr2 = NULL;
  65.     Initlist(&headptr2);
  66.     
  67.     NodePtr nodeptr2 = NULL;
  68.     CreatNode(&nodeptr2, "王贤才", "湖北", 'm', 98.00, 13);
  69.     AddNode(headptr2, nodeptr2);
  70.     CreatNode(&nodeptr2, "张秋苹", "湖北", 'w', 99.00, 12);
  71.     AddNode(headptr2, nodeptr2);
  72.     CreatNode(&nodeptr2, "程序员", "上海", 'm', 100.00, 11);
  73.     AddNode(headptr2, nodeptr2);
  74.     PrintAllNode(headptr2);
  75.     
  76.     
  77.     UnionList(headptr, headptr2);
  78.     PrintAllNode(headptr);
  79.     
  80.     SortNode(headptr);
  81.     PrintAllNode(headptr);
  82.     
  83.     SortNode2(headptr);
  84.     PrintAllNode(headptr);
  85.     printf("链表长度=[%d]\n", Lenlist(headptr));
  86.     
  87.     return 0;
  88. }

  89. /*功能:初始化循环单链表:(带头结点的)初始时链表为空*/
  90. int Initlist(NodePtr * headptr)
  91. {
  92.     printf("初始化链表......\n");
  93.     *headptr = (NodePtr)malloc(sizeof(NODE)); /*头结点*/
  94.     (*headptr)->next = *headptr; /*空循环链表*/
  95.     return 0;
  96. }

  97. /*创建一个节点*/
  98. int CreatNode(NodePtr * nodeptr, char * name, char * addr, char sex, float score, int id)
  99. {
  100.     *nodeptr = (NodePtr)malloc(sizeof(NODE));
  101.     memset((*nodeptr)->name, 0, sizeof(char)*NAMELEN);
  102.     strcpy((*nodeptr)->name, name);
  103.     memset((*nodeptr)->addr, 0, sizeof(char)*ADDRLEN);
  104.     strcpy((*nodeptr)->addr, addr);
  105.     (*nodeptr)->sex = sex;
  106.     (*nodeptr)->score = score;
  107.     (*nodeptr)->id = id;
  108.     (*nodeptr)->next = NULL;
  109.     return 0;
  110. }

  111. /*功能:求循环单链表的长度,参数node:头结点指针*/
  112. int Lenlist(NodePtr headptr)
  113. {
  114.     int len = 0;
  115.     NodePtr p = NULL;
  116.     p = headptr->next;
  117.     while(p != headptr)
  118.     {
  119.         len++;
  120.         p = p->next;
  121.     }
  122.     return len;
  123. }

  124. /*功能:求循环单链表中的第num个元素的节点指针*/
  125. int GetNode(NodePtr headptr, int num, NodePtr * nodeptr)
  126. {
  127.     NodePtr p = NULL;
  128.     int count = 1;
  129.     if(num < 0)
  130.     {
  131.         printf("num值不可小于0!\n");
  132.         return -1;
  133.     }
  134.     if(num == 0)
  135.     {
  136.         *nodeptr = headptr;
  137.         return 0;
  138.     }
  139.     p = headptr->next;
  140.     while((p != headptr)&&(count < num))
  141.     {
  142.         p = p->next;
  143.         count++;
  144.     }
  145.     if((p == headptr)||(count < num)) /*第num个元素不存在*/
  146.     {
  147.         printf("count = [%d]\n", count);
  148.         printf("第[%d]个元素不存在!\n", num);
  149.         return -1;
  150.     }
  151.     else if((p != headptr)&&(count == num)) /*第num个元素存在*/
  152.         {
  153.             *nodeptr = p;
  154.             return 0;
  155.         }
  156. }

  157. /*功能:在循环单链表尾插入一个元素*/
  158. int AddNode(NodePtr headptr, NodePtr nodeptr)
  159. {
  160.     printf("在链尾增加一个元素!\n");
  161.     NodePtr p = NULL;
  162.     
  163.     p = headptr;
  164.     while(p->next != headptr) /*p指向最后一个节点元素了*/
  165.     {
  166.         p = p->next;
  167.     }
  168.     p->next = nodeptr;
  169.     nodeptr->next = headptr;
  170.     
  171.     return 0;
  172. }

  173. /*功能:打印出循环单链表中所有节点元素的信息*/
  174. int PrintAllNode(NodePtr headptr)
  175. {
  176.     NodePtr p = NULL;
  177.     p = headptr->next;
  178.     printf("链表长度=[%d]\n", Lenlist(headptr));
  179.     printf("显示链表的所有内容如下:\n");
  180.     printf("*************************************************************************\n");
  181.     printf("id        name        addr        sex        score\n");
  182.     while(p != headptr)
  183.     {
  184.         printf("[%d]        [%s]    [%s]        [%c]        [%.2f]\n", p->id, p->name, p->addr, p->sex, p->score);
  185.         p = p->next;
  186.     }
  187.     return 0;
  188. }

  189. /*功能:在循环单链表的第num个元素之前插入一个元素(先找到第num-1个元素)*/
  190. int InsertNode(NodePtr headptr, int num, NodePtr nodeptr)
  191. {
  192.     int count = 1;
  193.     NodePtr p = NULL;
  194.     p = headptr->next;
  195.     while((p != headptr)&&(count < num-1)) /*p会指向第num-1个元素*/
  196.     {
  197.         count++;    
  198.         p = p->next;
  199.     }
  200.     if((p != headptr)&&(num-1 == 0))/*在第1个元素之前插入新的元素*/
  201.     {
  202.         nodeptr->next = headptr->next;
  203.         headptr->next = nodeptr;
  204.         return 0;
  205.     }
  206.     else if((p == headptr)||(count > num-1)) /*第num-1个元素不存在*/
  207.     {
  208.         printf("第[%d]个元素不存在!\n", num-1);
  209.         return -1;
  210.     }
  211.     else if((p != headptr)&&(count == num-1)) /*p指向第num-1个元素*/
  212.     {
  213.         nodeptr->next = p->next;
  214.         p->next = nodeptr;
  215.         return 0;
  216.     }
  217.     
  218.     return 0;
  219. }

  220. /*功能:删除循环单链表中的第num个元素*/
  221. int DeleteNode(NodePtr headptr, int num)
  222. {
  223.     NodePtr p = NULL;
  224.     NodePtr q = NULL;
  225.     int count = 1;
  226.     
  227.     p=headptr->next;
  228.     while((p != headptr)&&(count < num-1)) /*p会指向第num-1个元素*/
  229.     {
  230.         count++;    
  231.         p = p->next;
  232.     }
  233.     if((p != headptr)&&(num-1 == 0))/*要删除的是第1个元素*/
  234.     {
  235.         q = headptr->next;
  236.         headptr->next = headptr->next->next;
  237.         free(q); /*删除的节点要释放*/
  238.         return 0;
  239.     }
  240.     else if((p == headptr)||(count > num-1)) /*第num-1个元素不存在*/
  241.     {
  242.         printf("第[%d]个元素不存在!\n", num-1);
  243.         return -1;
  244.     }
  245.     else if((p != headptr)&&(count == num-1)) /*p指向第num-1个元素*/
  246.     {
  247.         q = p->next;
  248.         p->next = q->next;
  249.         free(q); /*删除的节点要释放*/
  250.         return 0;
  251.     }
  252.     
  253.     return 0;
  254. }

  255. /*功能:按照数据域中某个数据成员的值(id)对循环单循环链表的元素进行递增排序*/
  256. int SortNode(NodePtr headptr)
  257. {
  258.     int i, j, len;
  259.     NodePtr P0 = NULL;
  260.     NodePtr P1 = NULL;
  261.     NodePtr P2 = NULL;
  262.     
  263.     printf("对单链表排序如下:\n");
  264.     len = Lenlist(headptr);
  265.     /*只能用冒泡法排序:相邻两数比较,对链表来说,交换相邻两数要相对容易的多*/
  266.     for(i=0; i<len-1; i++)
  267.     {
  268.         for(j=0; j<len-1-i; j++)
  269.         {
  270.             GetNode(headptr, j, &P0); /*j=0,则P0是头指针*/
  271.             P1 = P0->next;
  272.             P2 = P0->next->next;
  273.             /*P1,P2是要交换的2个节点的指针,P0是这2个节点之前的节点指针*/
  274.             /*3个节点的指针都已经保存,所以就不需要另外定义临时节点指针了*/
  275.             if(P1->id > P2->id)
  276.             {
  277.                 P1->next = P2->next;
  278.                 P2->next = P1;
  279.                 P0->next = P2;
  280.             }
  281.         }
  282.     }
  283.     
  284.     return 0;
  285. }

  286. /*功能:按照数据域中某个数据成员的值(id)对循环单链表的元素进行递减排序*/
  287. int SortNode2(NodePtr headptr)
  288. {
  289.     int i, j, len;
  290.     NodePtr p0 = NULL;
  291.     NodePtr p1 = NULL;
  292.     NodePtr p2 = NULL;
  293.     
  294.     printf("对单链表排序如下:\n");
  295.     len = Lenlist(headptr);
  296.     /*只能用冒泡法排序:相邻两数比较,对链表来说,交换相邻两数要相对容易的多*/
  297.     for(i=0; i<len-1; i++)
  298.     {
  299.         p0 = headptr; /*p0指向头节点*/
  300.         for(j=0; j<len-1-i; j++)
  301.         {
  302.             p1 = p0->next;
  303.             p2 = p0->next->next;
  304.             /*p1,p2是要交换的2个节点的指针,p0是这2个节点之前的节点指针*/
  305.             /*3个节点的指针都已经保存,p2->next的链不要断了,
  306.             也可以定义4个节点的指针,就绝对不会断链了*/
  307.             if(p1->id < p2->id)
  308.             {
  309.                 p1->next = p2->next;
  310.                 p2->next = p1;
  311.                 p0->next = p2;
  312.             }
  313.             p0 = p0->next; /*第一个最小的已经排好,所以p0可以指向下一个节点了*/
  314.         }
  315.     }
  316.     
  317.     return 0;
  318. }

  319. /*功能:合并2条循环单链表为1条循环链表(不排序)(还可以做让2条已经有序的链表归并为1条有序的链表???)*/
  320. int UnionList(NodePtr headptr1, NodePtr headptr2)
  321. {
  322.     NodePtr p1 = NULL;
  323.     NodePtr p2 = NULL;
  324.     
  325.     p1 = headptr1;
  326.     while(p1->next != headptr1)/*p1指向链表1的最后一个节点元素了*/
  327.     {
  328.         p1 = p1->next;
  329.     }
  330.     p2 = headptr2;
  331.     while(p2->next != headptr2)/*p1指向链表2的最后一个节点元素了*/
  332.     {
  333.         p2 = p2->next;
  334.     }
  335.     
  336.     p1->next = headptr2->next; /*首尾连接2条链表*/
  337.     p2->next = headptr1;
  338.     free(headptr2); /*第2条链表的头节点要释放*/
  339.     return 0;
  340. }

阅读(651) | 评论(0) | 转发(0) |
0

上一篇:单非循环链表

下一篇:双向非循环链表

给主人留下些什么吧!~~