链表算法演示(郝斌)
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\n",val); 35 } 36 else 37 { 38 printf("删除失败!你删除的元素不存在!\n"); 39 } 40 traverse_list(pHead); 41 //int len = length_list(pHead); 42 // printf("链表的长度是%d\n",len); 43 44 //sort_list(pHead); 45 //traverse_list(pHead); 46 /*if (is_empty(pHead)) 47 printf("链表为空!\n"); 48 else 49 printf("链表不空!\n"); 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("分配失败,程序终止!\n"); 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("分配失败,程序终止!\n"); 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("\n"); 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("动态内存分配失败!\n"); 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 }