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

罗索

双向链表的基本操作

落鹤生 发布于 2012-03-20 15:16 点击:次 
双向链表的基本操作:创建链表、遍历(打印)、求长度、排序、插入、删除、查找
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; 

链表代码:

  1. PNODE create_list(void
  2.     int len; 
  3.     int i, val; 
  4.     PNODE pTail; 
  5.  
  6.     PNODE pHead = (PNODE)malloc(sizeof(NODE)); 
  7.     if(NULL == pHead) 
  8.     { 
  9.         printf("动态内存分配失败,程序终止!/n"); 
  10.         exit(-1); 
  11.     } 
  12.     pTail = pHead; 
  13.     pTail->next = NULL; 
  14.  
  15.     printf("请输入您要创建链表的长度:/nlen = "); 
  16.     scanf("%d",&len); 
  17.  
  18.     for(i = 0; i < len; i++) 
  19.     { 
  20.         printf("请输入第%d个节点的值:val = ", i+1); 
  21.         scanf("%d",&val); 
  22.  
  23.         PNODE pNew = (PNODE)malloc(sizeof(NODE)); 
  24.         if(NULL == pNew) 
  25.         { 
  26.             printf("新节点动态内存分配失败,程序终止!/n"); 
  27.             exit(-1); 
  28.         } 
  29.         pNew->data = val; 
  30.         pTail->next = pNew; 
  31.         pNew->prior = pTail; //更正错误
  32.         pNew->next = NULL; 
  33.         pTail = pNew; 
  34.     } 
  35.     return pHead; 
  36.  
  37. void traverse_list(PNODE pHead) 
  38.     PNODE p; 
  39.     p = pHead->next; 
  40.     if(NULL == p) 
  41.     { 
  42.         printf("链表为空!/n"); 
  43.     } 
  44.     while(NULL != p) 
  45.     { 
  46.         printf("%d  ",p->data); 
  47.         p = p->next; 
  48.     } 
  49.     printf("/n"); 
  50.  
  51.     return
  52.  
  53. int length_list(PNODE pHead) 
  54.     int len = 0; 
  55.     PNODE p; 
  56.     p = pHead; 
  57.  
  58.     while(NULL != p) 
  59.     { 
  60.         len++; 
  61.         p = p->next; 
  62.     } 
  63.     return len-1; 
  64.  
  65.  
  66. void sort_list(PNODE pHead) 
  67.     int len, i, j, temp; 
  68.     PNODE p, q; 
  69.  
  70.     len = length_list(pHead); 
  71.  
  72.     for(i = 0,p = pHead->next; i < len; i++,p = p->next) 
  73.     { 
  74.         for(j = i+1, q = p->next; j < len; j++, q = q->next) 
  75.         { 
  76.             if(p->data > q->data) 
  77.             { 
  78.                 temp = p->data; 
  79.                 p->data = q->data; 
  80.                 q->data = temp; 
  81.             } 
  82.         } 
  83.     } 
  84.     return
  85.  
  86. void insert_list(PNODE pHead, int pos, int val) 
  87.     int i; 
  88.     PNODE pNew, p; 
  89.     p = pHead; 
  90.  
  91.     pNew = (PNODE)malloc(sizeof(NODE)); 
  92.     if(NULL == pNew) 
  93.     { 
  94.         printf("新节点动态内存分配失败,程序终止!/n"); 
  95.         exit(-1); 
  96.     } 
  97.     pNew->data = val; 
  98.  
  99.     if((pos > (length_list(pHead)+1)) || (pos <= 0)) 
  100.     { 
  101.         printf("插入失败,插入位置不正确!/n"); 
  102.         exit(-1); 
  103.     } 
  104.     for(i = 0; i < pos-1; i++) 
  105.     { 
  106.         p = p->next; 
  107.     } 
  108.     pNew->next = p->next; 
  109.     p->next = pNew; 
  110.     p = pNew->prior; 
  111.  
  112.     return
  113.  
  114. void delect_list(PNODE pHead, int pos, int *val) 
  115.     int i; 
  116.     PNODE p = pHead; 
  117.  
  118.     if(length_list(pHead) == 0) 
  119.     { 
  120.         printf("链表为空,没有内容可以删除!/n"); 
  121.         exit(-1); 
  122.     } 
  123.     if((pos > length_list(pHead)) || (pos <= 0)) 
  124.     { 
  125.         printf("删除元素的位置不是合法位置,删除失败!/n"); 
  126.         exit(-1); 
  127.     } 
  128.     for(i = 0; i < pos-1; i++) 
  129.     { 
  130.         p = p->next; 
  131.     } 
  132.     if(NULL == p->next->next) 
  133.     { 
  134.         *val = p->next->data; 
  135.         p->next = NULL; 
  136.     } 
  137.     else if(NULL == p->next->next->next) 
  138.     { 
  139.         *val = p->next->data; 
  140.         p->next->next = NULL; 
  141.         
  142.     } 
  143.     else 
  144.     {
  145.         *val = p->next->data; 
  146.         p->next = p->next->next; 
  147.         p->next->next->prior = p; 
  148.     } 
  149.  
  150.     return
  151.  
  152. int find_list(PNODE pHead, int val,int *pos) 
  153.     PNODE p = pHead; 
  154.     int i = 0; 
  155.  
  156.     while(p != NULL) 
  157.     { 
  158.         i++; 
  159.         if(p->data == val) 
  160.         { 
  161.             *pos = i-1; 
  162.             return 0; 
  163.         } 
  164.         p = p->next; 
  165.     } 
  166.     return 1; 
(sunsea1026)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201108/14825.html]
本文出处:CSDN博客 作者:sunsea1026
顶一下
(7)
58.3%
踩一下
(5)
41.7%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容