链表后续完善(一)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <malloc.h>
  4 #include <stdbool.h>
  5 
  6 typedef struct Node{
  7     int data;        //数据域
  8     struct Node * pNext;    //指针域
  9 }NODE, * PNODE;        //NODE等价于struct Node, * PNODE等价于struct Node *
 10 
 11 PNODE createList();                //创建链表
 12 void traverseList(PNODE pHead);    //遍历
 13 bool isEmpty(PNODE pHead);        //判断链表是否为空
 14 int getLength(PNODE pHead);        //取得链表长度
 15 bool insertList(PNODE pHead);    //插入元素
 16 bool deleteList(PNODE pHead, int * pVal );    //删除元素
 17 void sortList(PNODE pHead);        //排序
 18 
 19 int main()
 20 {
 21 
 22     PNODE pHead = NULL;        //等价于struct Node * pHead = NULL;
 23     pHead = createList();    //createList()函数功能:创建一个非循环单链表
 24                             //并将该链表的头节点的地址赋给pHead
 25    /*                      
 26     if(insertList(pHead)){
 27     printf("插入成功!\n");
 28     }else{
 29      printf("插入失败!\n");
 30     }
 31     
 32         
 33    // sortList(pHead);
 34     */
 35 
 36     int val;
 37     if(deleteList(pHead, &val)){
 38         printf("删除成功!\n");
 39         printf("删除的元素是%d\n", val);
 40     }else{
 41         printf("删除失败!\n");
 42     }
 43     
 44     traverseList(pHead);    
 45     
 46     if(isEmpty(pHead)){
 47         printf("链表为空!\n");
 48     }else{
 49         printf("链表不空!\n");    
 50     }
 51    
 52     
 53     printf("链表的长度为:%d!\n", getLength(pHead));    
 54     
 55     system("pause");
 56     return 0;
 57 }
 58 
 59 PNODE createList(void){
 60     int len;    //用来存放有效节点的个数
 61     int i;
 62     int val;    //用来临时存放用户输入的节点的值
 63     
 64     //分配了一个不存放有效数据的头节点
 65     PNODE pHead = (PNODE)malloc(sizeof(NODE));
 66     if(NULL == pHead){
 67         printf("分配失败!\n");
 68         exit(-1);
 69     }
 70     
 71     //创建一个永远指向尾节点的指针
 72     PNODE pTail = pHead;    
 73     pTail->pNext = NULL;        
 74     
 75     printf("请输入您需要生成的链表节点的个数:len = ");
 76     scanf("%d", &len);
 77 
 78     
 79     for(i = 0; i < len; ++i){
 80         printf("请输入第%d个节点的值:", i+1);
 81         scanf("%d", &val);
 82         
 83         PNODE pNew  = (PNODE)malloc(sizeof(NODE));
 84         if(NULL == pNew){
 85         printf("分配失败!\n");
 86         exit(-1);
 87         }
 88         pNew->data = val;
 89         pTail->pNext = pNew;
 90         pNew->pNext = NULL;
 91         pTail = pNew;
 92         
 93     }
 94     return pHead;
 95 } 
 96 
 97 void traverseList(PNODE pHead){
 98     PNODE p = pHead->pNext;
 99     
100     while(p != NULL){
101         printf("%d   ", p->data);
102         p = p->pNext;
103     }
104     
105     printf("\n");
106 }
107 
108 bool isEmpty(PNODE pHead){
109     if(NULL == pHead->pNext)
110         return true;
111     else
112         return false;
113 }
114 
115 int getLength(PNODE pHead){
116     PNODE p = pHead->pNext;
117     int len  = 0;
118     
119     while(NULL != p){
120         ++len;
121         p = p->pNext;
122     }
123     return len;
124 }
125 
126 //在pHead所指向链表的第POS个节点前面插入一个新的节点,该节点的值是val,并且POS的值从1开始
127 bool insertList(PNODE pHead){
128     
129     int i = 0;
130     int pos, val;
131     printf("请输入您要插入的位置:pos = ");
132     scanf("%d", &pos);
133     
134     printf("请输入您要插入的数据:val = ");
135     scanf("%d", &val);
136     
137     PNODE p = pHead;
138     while(NULL != p && i < pos-1){
139         p = p->pNext;
140         ++i;
141     }
142     
143     //判断POS的位置是否合法
144     if(i>pos-1 || NULL == p)
145         return false;
146     PNODE pNew = (PNODE)malloc(sizeof(NODE));
147     if(NULL == pNew){
148         printf("动态分配内存失败!\n");
149         exit(-1);
150     }    
151     pNew->data = val;
152     pNew->pNext = p->pNext;
153     p->pNext = pNew;
154    
155    
156     return true;
157    
158 }
159     
160 void sortList(PNODE pHead){
161     int i, j, t;
162     int len = getLength(pHead);
163     PNODE p, q;
164     
165     for(i = 0, p = pHead->pNext; i<len-1; ++i, p = p->pNext){
166         for(j = i+1, q = p->pNext; j < len; ++j, q = q->pNext){
167             if(p->data > q->data){
168                 t = p->data;
169                 p->data = q->data;
170                 q->data = t;
171             }
172         }
173     }
174 }
175 
176 bool deleteList(PNODE pHead, int * pVal ){
177     int i = 0;    
178     int pos;
179     printf("请输入您要删除的位置:pos = ");
180     scanf("%d", &pos);
181     
182     PNODE p = pHead;
183     while(NULL != p->pNext && i < pos-1){
184         p = p->pNext;
185         ++i;
186     }
187     //判断POS的位置是否合法
188     if(i>pos-1 || NULL == p->pNext)
189         return false;
190    
191     PNODE q = p->pNext;
192 
193     *pVal = q->data;
194     //删除p节点后面的节点
195     p->pNext = q->pNext;
196     free(q);
197     q = NULL;
198 
199     return true;
200     
201 }

 

posted @ 2016-06-01 23:13  陆放为  阅读(268)  评论(0编辑  收藏  举报