链表算法演示(郝斌)

  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 }
原文地址:https://www.cnblogs.com/huangtao1996/p/4827296.html