链表后续完善(一)
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 }