这里先删除第2个结点,测试 deleNode 函数
1 /*把第i个结点从链表中删除*/ 2 3 4 #include<stdio.h> 5 #include<stdlib.h> 6 7 //链表中节点的结构 8 typedef struct Link { 9 int data; 10 struct Link* next; 11 }link; 12 13 //链表初始化 14 link* initByTailInsert() { 15 link* phead = NULL;//创建头指针 16 link* first_node = (link*)malloc(sizeof(link));//创建第一个节点 17 //第一个结点先初始化 18 first_node->data = 1; 19 first_node->next = NULL; 20 phead = first_node;//头指针指向第一个节点 21 22 //尾插入赋值 23 for (int i = 2; i < 5; i++) { 24 link* new_node = (link*)malloc(sizeof(link)); //申请新的结点 25 new_node->data = i; 26 new_node->next = NULL; 27 first_node->next = new_node; //第一个结点的指针域指向这个新申请的结点 28 first_node = new_node; //第一个结点后移 29 } 30 31 printf("头指针指向的值是:%d ", phead->data);//1 32 return phead; //将指向第一个结点的头指针返回 33 } 34 35 36 37 void showLink(link* phead) { 38 link* tmp = phead;//将头指针赋给tmp,tmp也是一个头指针 39 //只要tmp指针指向的结点的next不是Null,就执行输出语句。 40 while (tmp != NULL) { 41 printf("%d ", tmp->data); 42 tmp = tmp->next; 43 } 44 printf(" "); 45 } 46 47 link* getElemByNum(link* phead,int num) { 48 int j = 1; //计数器 49 link* tmp = phead; 50 while (tmp != NULL && num>j) { 51 tmp = tmp->next; 52 j++; 53 } 54 if (tmp == NULL || num<j) { 55 //printf("这个元素不存在 "); 56 return NULL; 57 } 58 else { 59 return tmp; 60 } 61 } 62 63 64 void deleNode(link* phead,int num) { 65 link* tmp = phead; 66 link* front_node = getElemByNum(tmp,num - 1); 67 link* back_node = getElemByNum(tmp, num + 1); 68 link* cur_node = getElemByNum(tmp,num); 69 front_node->next = back_node; 70 free(cur_node); 71 showLink(tmp); 72 } 73 74 75 void main() { 76 //初始化链表(1,2,3,4) 77 printf("初始化链表为: "); 78 link* phead = initByTailInsert(); //创建头指针,得到经过初始化后的头指针 79 showLink(phead); 80 int num = 0; 81 printf("请输入要删除的结点的号码:"); 82 scanf("%d", &num); 83 link* isfind = getElemByNum(phead, num); 84 if (isfind != NULL) { 85 //printf("第%d个元素是:%d", num, isfind->data); 86 printf("删除第%d个结点后的链表是: ", num); 87 deleNode(phead,num); 88 } 89 else { 90 printf("这个结点没找到 "); 91 } 92 93 }