织梦CMS - 轻松建站从此开始!

罗索

双向链表的基本操作

jackyhwei 发布于 2011-09-23 09:20 点击:次 
双向链表的基本操作:创建链表、遍历(打印)、求长度、排序、插入、删除、查找
TAG:

/* 双向链表的基本操作
 * 创建链表、遍历(打印)、求长度、排序、插入、删除、查找
 */

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3.  
  4. typedef struct Node 
  5.     int data; 
  6.     struct Node * next; 
  7.     struct Node * prior; 
  8. }NODE, *PNODE; 
  9.  
  10. PNODE create_list(void);    //创建节点 
  11. void traverse_list(PNODE pHead);    //遍历链表(打印) 
  12. int length_list(PNODE pHead);        //求链表长度 
  13. void sort_list(PNODE pHead);        //排序 
  14. void insert_list(PNODE pHead, int pos, int val);        //插入节点 
  15. void delect_list(PNODE pHead, int pos, int *val);    //删除节点 
  16. int find_list(PNODE pHead, int val,int *pos);        //查找元素 
  17.  
  18. int main(int argc, char* argv[]) 
  19.     int pos_insert; 
  20.     int val_insert; 
  21.     int pos_delect; 
  22.     int val_delect; 
  23.     int pos_find; 
  24.     int val_find; 
  25.  
  26.     PNODE pHead = NULL; 
  27.  
  28.     pHead = create_list(); 
  29.     printf("/n原来链表:/n"); 
  30.     traverse_list(pHead); 
  31.     printf("链表的长度是:%d/n",length_list(pHead)); 
  32.     printf("/n"); 
  33.  
  34.     printf("请输入您要插入的元素位置:pos = "); 
  35.     scanf("%d",&pos_insert); 
  36.     printf("请输入您要插入的元素值:val = "); 
  37.     scanf("%d",&val_insert); 
  38.     printf("插入元素后:/n"); 
  39.     insert_list(pHead, pos_insert, val_insert); 
  40.     traverse_list(pHead); 
  41.     printf("链表的长度是:%d/n",length_list(pHead)); 
  42.     printf("/n"); 
  43.  
  44.     printf("请输入您要删除的元素位置:pos = "); 
  45.     scanf("%d",&pos_delect); 
  46.     printf("删除元素后:/n"); 
  47.     delect_list(pHead, pos_delect, &val_delect); 
  48.     traverse_list(pHead); 
  49.     printf("链表的长度是:%d/n",length_list(pHead)); 
  50.     printf("您删除的节点元素是:%d/n",val_delect); 
  51.     printf("/n"); 
  52.  
  53.     printf("请输入您要查找的元素的值:val = "); 
  54.     scanf("%d",&val_find); 
  55.     printf("查找元素:/n"); 
  56.     if(find_list(pHead, val_find, &pos_find) == 0) 
  57.     { 
  58.         traverse_list(pHead); 
  59.         printf("您要查找的元素位置是:%d/n", pos_find); 
  60.         printf("/n"); 
  61.     } 
  62.     else 
  63.         printf("您要查找的元素不存在!/n"); 
  64.     printf("/n"); 
  65.  
  66.     printf("排序后:/n"); 
  67.     sort_list(pHead); 
  68.     traverse_list(pHead); 
  69.     printf("链表的长度是:%d/n",length_list(pHead)); 
  70.     printf("/n"); 
  71.  
  72.     return 0; 
  73.  
  74. PNODE create_list(void
  75.     int len; 
  76.     int i, val; 
  77.     PNODE pTail; 
  78.  
  79.     PNODE pHead = (PNODE)malloc(sizeof(NODE)); 
  80.     if(NULL == pHead) 
  81.     { 
  82.         printf("动态内存分配失败,程序终止!/n"); 
  83.         exit(-1); 
  84.     } 
  85.     pTail = pHead; 
  86.     pTail->next = NULL; 
  87.  
  88.     printf("请输入您要创建链表的长度:/nlen = "); 
  89.     scanf("%d",&len); 
  90.  
  91.     for(i = 0; i < len; i++) 
  92.     { 
  93.         printf("请输入第%d个节点的值:val = ", i+1); 
  94.         scanf("%d",&val); 
  95.  
  96.         PNODE pNew = (PNODE)malloc(sizeof(NODE)); 
  97.         if(NULL == pNew) 
  98.         { 
  99.             printf("新节点动态内存分配失败,程序终止!/n"); 
  100.             exit(-1); 
  101.         } 
  102.         pNew->data = val; 
  103.         pTail->next = pNew; 
  104.         pTail = pNew->prior; 
  105.         pNew->next = NULL; 
  106.         pTail = pNew; 
  107.     } 
  108.     return pHead; 
  109.  
  110. void traverse_list(PNODE pHead) 
  111.     PNODE p; 
  112.     p = pHead->next; 
  113.     if(NULL == p) 
  114.     { 
  115.         printf("链表为空!/n"); 
  116.     } 
  117.     while(NULL != p) 
  118.     { 
  119.         printf("%d  ",p->data); 
  120.         p = p->next; 
  121.     } 
  122.     printf("/n"); 
  123.  
  124.     return
  125.  
  126. int length_list(PNODE pHead) 
  127.     int len = 0; 
  128.     PNODE p; 
  129.     p = pHead; 
  130.  
  131.     while(NULL != p) 
  132.     { 
  133.         len++; 
  134.         p = p->next; 
  135.     } 
  136.     return len-1; 
  137.  
  138.  
  139. void sort_list(PNODE pHead) 
  140.     int len, i, j, temp; 
  141.     PNODE p, q; 
  142.  
  143.     len = length_list(pHead); 
  144.  
  145.     for(i = 0,p = pHead->next; i < len; i++,p = p->next) 
  146.     { 
  147.         for(j = i+1, q = p->next; j < len; j++, q = q->next) 
  148.         { 
  149.             if(p->data > q->data) 
  150.             { 
  151.                 temp = p->data; 
  152.                 p->data = q->data; 
  153.                 q->data = temp; 
  154.             } 
  155.         } 
  156.     } 
  157.     return
  158.  
  159. void insert_list(PNODE pHead, int pos, int val) 
  160.     int i; 
  161.     PNODE pNew, p; 
  162.     p = pHead; 
  163.  
  164.     pNew = (PNODE)malloc(sizeof(NODE)); 
  165.     if(NULL == pNew) 
  166.     { 
  167.         printf("新节点动态内存分配失败,程序终止!/n"); 
  168.         exit(-1); 
  169.     } 
  170.     pNew->data = val; 
  171.  
  172.     if((pos > (length_list(pHead)+1)) || (pos <= 0)) 
  173.     { 
  174.         printf("插入失败,插入位置不正确!/n"); 
  175.         exit(-1); 
  176.     } 
  177.     for(i = 0; i < pos-1; i++) 
  178.     { 
  179.         p = p->next; 
  180.     } 
  181.     pNew->next = p->next; 
  182.     p->next = pNew; 
  183.     p = pNew->prior; 
  184.  
  185.     return
  186.  
  187. void delect_list(PNODE pHead, int pos, int *val) 
  188.     int i; 
  189.     PNODE p = pHead; 
  190.  
  191.     if(length_list(pHead) == 0) 
  192.     { 
  193.         printf("链表为空,没有内容可以删除!/n"); 
  194.         exit(-1); 
  195.     } 
  196.     if((pos > length_list(pHead)) || (pos <= 0)) 
  197.     { 
  198.         printf("删除元素的位置不是合法位置,删除失败!/n"); 
  199.         exit(-1); 
  200.     } 
  201.     for(i = 0; i < pos-1; i++) 
  202.     { 
  203.         p = p->next; 
  204.     } 
  205.     if(NULL == p->next->next) 
  206.     { 
  207.         *val = p->next->data; 
  208.         p->next = NULL; 
  209.     } 
  210.     else if(NULL == p->next->next->next) 
  211.     { 
  212.         *val = p->next->data; 
  213.         p->next->next = NULL; 
  214.         
  215.     } 
  216.     else 
  217.     { 
  218.         *val = p->next->data; 
  219.         p->next = p->next->next; 
  220.         p->next->next->prior = p; 
  221.     } 
  222.  
  223.     return
  224.  
  225. int find_list(PNODE pHead, int val,int *pos) 
  226.     PNODE p = pHead; 
  227.     int i = 0; 
  228.  
  229.     while(p != NULL) 
  230.     { 
  231.         i++; 
  232.         if(p->data == val) 
  233.         { 
  234.             *pos = i-1; 
  235.             return 0; 
  236.         } 
  237.         p = p->next; 
  238.     } 
  239.     return 1; 

 

(张双喜)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201109/15036.html]
本文出处:blog.csdn.net/sunsea1026 作者:张双喜
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容