zoukankan      html  css  js  c++  java
  • 链表算法演示(郝斌)

      1 /*
      2     list.c
      3     代码是在看视频时跟着敲的,如有错误请指正
      4     用的编译器:c-free
      5 */
      6 #include<stdio.h>
      7 #include<stdlib.h>
      8 #include<stdbool.h>
      9  
     10 typedef struct Node
     11 {
     12     int data;//    数据域
     13     struct Node * pNext;//指针域 
     14 }NODE, *PNODE;//NODE等价于struct Node  PNODE等价于struct Node * 
     15  PNODE create_list(void);
     16  void traverse_list(PNODE phead);
     17  bool is_empty(PNODE pHead);
     18  int length_list(PNODE);
     19  bool insert_list(PNODE,int,int);//在pHead所指向链表的第pos个节点的前面 插入一个新的结点,该节点的值是val ,并且pos的值是从1开始 
     20  bool delete_list(PNODE,int,int *);
     21  void sort_list(PNODE);
     22 
     23 int main(void)
     24 {
     25     PNODE pHead = NULL; //等价于 struct Node * pHead = NULL;
     26     int val;
     27     
     28     pHead = create_list();//创建一个非循环单链表
     29     traverse_list(pHead);
     30     
     31     //insert_list(pHead, 4, 33); 
     32     if(delete_list(pHead, 4, &val))
     33     {
     34         printf("删除成功,您删除的元素是:%d
    ",val);
     35     }
     36     else
     37     {
     38         printf("删除失败!你删除的元素不存在!
    ");
     39     }
     40     traverse_list(pHead);
     41     //int len = length_list(pHead);
     42 //    printf("链表的长度是%d
    ",len);
     43     
     44     //sort_list(pHead);
     45     //traverse_list(pHead);
     46     /*if (is_empty(pHead))
     47          printf("链表为空!
    ");
     48     else
     49         printf("链表不空!
    ");
     50     */
     51     return 0;
     52     
     53 }
     54 
     55 PNODE create_list(void)
     56 {
     57     int len;//用来存放有效节点的个数 
     58     int i;
     59     int val;//用来临时存放用户输入的结点的值 
     60     
     61     //分配 了一个不存放有效数据的头结点 
     62     PNODE pHead = (PNODE)malloc(sizeof(NODE));
     63     if(NULL == pHead)
     64    {
     65            printf("分配失败,程序终止!
    ");    
     66            exit(-1);
     67    }
     68    PNODE pTail = pHead;
     69    pTail->pNext = NULL;
     70        
     71     printf("请输入你需要生成的链表节点数:len = ");
     72     scanf("%d", &len);
     73     
     74     for(i=0; i<len; ++i)
     75     {
     76         printf("请输入第%d个节点的值:", i+1);
     77         scanf("%d", &val);
     78         
     79         PNODE pNew = (PNODE)malloc(sizeof(NODE));
     80         if(NULL == pNew)
     81         {
     82             printf("分配失败,程序终止!
    ");
     83             exit(-1);
     84         }
     85         pNew->data = val; 
     86         pTail->pNext = pNew;
     87         pNew->pNext = NULL;
     88         pTail = pNew;
     89     }
     90     
     91     return pHead;
     92 }
     93 
     94 void traverse_list(PNODE pHead)
     95 {
     96     PNODE p = pHead->pNext;
     97     
     98     while(NULL != p)
     99     {
    100         printf("%d ", p->data);
    101         p = p->pNext;
    102     } 
    103     printf("
    ");
    104     
    105     return;
    106 }
    107 
    108 bool is_empty(PNODE pHead)
    109 {
    110     if(NULL == pHead->pNext)
    111         return true;
    112     else
    113         return false;
    114     
    115 }
    116 int length_list(PNODE pHead)
    117 {
    118     PNODE p = pHead->pNext;
    119     int len = 0;
    120     
    121     while (NULL != p)
    122     {
    123         ++len;
    124         p = p->pNext;
    125     }
    126     return len;    
    127 }
    128 
    129 void sort_list(PNODE pHead)
    130 {
    131     int i, j, t;
    132     int len = length_list(pHead);
    133     PNODE p, q;
    134     
    135     for(i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext)
    136     {
    137         for(j=i+1,q=p->pNext; j<len; ++j,q=q->pNext)
    138         {
    139             if(p->data >  q->data)//类似于数组中的 a[i] > a[j]
    140             {
    141                 t = p->data;//类似于数组中的:t = a[i]; 
    142                 p->data = q->data;//类似于数组中的:a[i] = a[j]; 
    143                 q->data = t;//类似于数组中的 a[j] = t; 
    144             }
    145         }
    146     }
    147 }
    148 
    149 //在pHead所指向链表的第pos个节点的前面 插入一个新的结点,该节点的值是val ,并且pos的值是从1开始 
    150 bool insert_list(PNODE pHead,int pos,int val)
    151 {
    152     int i = 0;
    153     PNODE p = pHead;
    154     
    155     while (NULL != p && i<pos-1)
    156     {
    157         p = p->pNext;
    158         ++i;
    159     } 
    160     if(i>pos-1 || NULL==p)
    161         return false;
    162         
    163     PNODE pNew = (PNODE)malloc (sizeof(NODE)); 
    164     if(NULL == pNew)
    165     {
    166         printf("动态内存分配失败!
    ");
    167         exit(-1);
    168     }
    169     pNew->data = val;
    170     PNODE q = p->pNext;//q的作用就是临时temp变量
    171      p->pNext = pNew;
    172      pNew->pNext = q;
    173      
    174      return true;
    175 }
    176 
    177 bool delete_list(PNODE pHead,int pos,int *pVal)
    178 {
    179     int i = 0;
    180     PNODE p = pHead;
    181     
    182     while (NULL != p->pNext && i<pos-1)
    183     {
    184         p = p->pNext;
    185         ++i;
    186     } 
    187     if(i>pos-1 || NULL==p->pNext)
    188         return false;
    189     
    190     PNODE q = p->pNext;
    191     *pVal = q->data;
    192     
    193     //删除p节点后面的结点 
    194     p->    pNext = p->pNext->pNext;
    195     free(q);
    196     q = NULL;
    197      
    198      return true;    
    199 }
  • 相关阅读:
    asp.net tutorial(http://www.cnblogs.com/mqingqing123/archive/2006/04/16/376358.html)
    CSS五日教程 (reference to http://www.tuqiu.com/study/css/day1_1.php)
    CSS教程 http://www.lnnu.edu.cn/dandu/hqcy/internet/jiaocheng/css/css.htm
    关于Spoolsv.exe
    理解MVC
    Design Patterns(十五):Command PatternVB代码
    Design Patterns(十六):Interpreter PatternVB代码
    Design Patterns(十三):Proxy PatternVB代码
    Design Patterns(二十):Observer PatternVB代码
    【转】VB中动态编程的技巧和挑战:多重分派
  • 原文地址:https://www.cnblogs.com/huangtao1996/p/4827296.html
Copyright © 2011-2022 走看看