1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<math.h> 5 typedef struct node 6 { 7 int data; 8 struct node * next; 9 }linkNode; 10 typedef linkNode *pLinkNode; 11 12 void creatLinkByHeadInsert(pLinkNode &head,int n);//生成n个随机数,用头插法构造链表 13 void creatLinkByTailInsert(pLinkNode &head,int n);//生成n个随机数,用尾插法构造链表 14 void printLink(pLinkNode head);//输出链表的结点值 15 void delLink(pLinkNode &head);//释放整条链的所有结点 16 void delLinkNode(pLinkNode &head,int k);//删除并释放链表的第k个结点 17 void delLinkNodeByVal(pLinkNode &head,int k);//删除链表中所有值为k的结点 18 void insertNode(pLinkNode &head,int data,int k);//用data构造一个结点并插入链表,使其成为链表的第k个结点(若链表节点数小于k-1则插入到链表末尾) 19 20 int main() 21 { 22 pLinkNode head; 23 int valToDel,valToInsert; 24 25 /* 26 head=NULL; 27 creatLinkByHeadInsert(head,10); 28 printLink(head); 29 delLinkNode(head,1); 30 printLink(head); 31 delLinkNode(head,2); 32 printLink(head); 33 delLink(head); 34 if(head==NULL) 35 printf("链表所有结点释放成功. "); 36 else 37 printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。 "); 38 */ 39 40 41 42 printf(" "); 43 head=NULL; 44 creatLinkByTailInsert(head,10); 45 printLink(head); 46 47 printf("输入一个想要删除的数:"); 48 scanf("%d",&valToDel); 49 delLinkNodeByVal(head,valToDel); 50 printLink(head); 51 52 printf("输入一个想要插入的数:"); 53 scanf("%d",&valToInsert); 54 insertNode(head,valToInsert,1); 55 insertNode(head,valToInsert,3); 56 insertNode(head,valToInsert,12); 57 printf("插入第1和第3,12个位置后的序列为: "); 58 printLink(head); 59 60 delLink(head); 61 if(head==NULL) 62 printf("链表所有结点释放成功. "); 63 else 64 printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。 "); 65 66 return 0; 67 } 68 69 //生成n个随机数,用头插法构造链表 70 void creatLinkByHeadInsert(pLinkNode &head,int n) 71 { 72 int i; 73 pLinkNode p; 74 head=NULL; 75 76 srand((unsigned)time(0)); 77 for(i=0;i<n;i++) 78 { 79 p=(pLinkNode)malloc(sizeof(linkNode)); 80 p->data=rand()%100+10; 81 p->next=NULL; 82 printf("%d ",p->data); 83 84 if(head==NULL) 85 { 86 head=p; 87 } 88 else 89 { 90 p->next=head; 91 head=p; 92 } 93 } 94 printf(" "); 95 } 96 97 //输出链表的结点值 98 void printLink(pLinkNode head) 99 { 100 pLinkNode p; 101 p=head; 102 while(p!=NULL) 103 { 104 printf("%d ",p->data); 105 p=p->next; 106 } 107 printf(" "); 108 } 109 110 //生成n个随机数,用尾插法构造链表 111 void creatLinkByTailInsert(pLinkNode &head,int n) 112 { 113 pLinkNode end,p; 114 int i; 115 116 head=NULL; 117 end=NULL; 118 119 srand((unsigned)time(0)); 120 for(i=0;i<n;i++) 121 { 122 p=(pLinkNode)malloc(sizeof(linkNode)); 123 p->data=rand()%100+10; 124 p->next=NULL; 125 printf("%d ",p->data); 126 127 if(head==NULL) 128 { 129 head=p; 130 end=p; 131 } 132 else 133 { 134 end->next=p; 135 end=p; 136 } 137 } 138 printf(" "); 139 } 140 141 //释放整条链的所有结点 142 void delLink(pLinkNode &head) 143 { 144 pLinkNode p,q; 145 p=head; 146 147 while(p!=NULL) 148 { 149 q=p->next; 150 free(p); 151 p=q; 152 } 153 head=NULL; 154 } 155 156 //删除并释放链表的第k个结点 157 void delLinkNode(pLinkNode &head,int k) 158 { 159 pLinkNode p,q; 160 int i; 161 162 if(k==1) 163 { 164 p=head; 165 head=head->next; 166 free(p); 167 } 168 else 169 { 170 q=head; 171 p=head->next; 172 i=2; 173 while(p!=NULL&&i<k) 174 { 175 q=p; 176 p=p->next; 177 i++; 178 } 179 if(p==NULL) 180 return; 181 else 182 { 183 q->next=p->next; 184 free(p); 185 } 186 } 187 } 188 189 //删除链表中所有值为k的结点 190 void delLinkNodeByVal(pLinkNode &head,int k) 191 { 192 pLinkNode p,q; 193 while(head->data==k) 194 { 195 p=head; 196 head=head->next; 197 free(p); 198 } 199 200 p=head->next; 201 q=head; 202 while(p!=NULL) 203 { 204 if(p->data==k) 205 { 206 q->next=p->next; 207 free(p); 208 p=q->next; 209 } 210 else 211 { 212 q=p; 213 p=p->next; 214 } 215 } 216 } 217 218 //用data构造一个结点并插入链表,使其成为链表的第k个结点(若链表节点数小于k-1则插入到链表末尾) 219 void insertNode(pLinkNode &head,int data,int k) 220 { 221 pLinkNode p,q; 222 int i; 223 224 p=(pLinkNode)malloc(sizeof(linkNode)); 225 p->data=data; 226 p->next=NULL; 227 228 if(k==1) 229 { 230 p->next=head; 231 head=p; 232 } 233 else 234 { 235 q=head; 236 for(i=2;i<k&&q!=NULL;i++) 237 { 238 q=q->next; 239 } 240 if(q==NULL) 241 { 242 q->next=p; 243 } 244 else 245 { 246 p->next=q->next; 247 q->next=p; 248 } 249 } 250 }