标签:alt lib div val back 分配 bubuko style 返回
1 /* 2 链表测试 3 */ 4 5 #include <stdio.h> 6 //#include <stdlib.h> 7 //#include <malloc.h> 8 9 #define true 1 10 #define false 0 11 12 /*定义链表中的节点*/ 13 typedef struct node 14 { 15 int member; /*节点中的成员*/ 16 struct node *pNext; /*指向下一个节点的指针*/ 17 }Node, *pNode; 18 19 /*创建链表函数*/ 20 pNode CreateList(void); 21 /*遍历链表函数*/ 22 void TraverseList(pNode); 23 /*链表节点插入函数*/ 24 unsigned char Insert_Node(pNode pHead, int front, int data); 25 /*删除链表节点*/ 26 int Del_Node(pNode, int); 27 28 /*主函数*/ 29 int main() 30 { 31 pNode pHead = NULL; /*定义初始化头节点,等价于 struct Node *pHead == NULL*/ 32 int data; /*作为Insert_Node函数的第三个参数*/ 33 int num; /*作为Inset_Node函数第二个参数*/ 34 int choose; 35 int return_val; 36 pHead = CreateList(); /*创建一个非循环单链表,并将该链表的头结点的地址付给pHead*/ 37 38 while (1) 39 { 40 printf("你输入的数据是:"); 41 TraverseList(pHead); /*调用遍历链表函数*/ 42 printf("是否还要进行如下操作:\n"); 43 printf("1.插入数据 2.删除数据\n"); 44 printf("请输入:"); 45 scanf_s("%d", &choose); 46 switch (choose) 47 { 48 case 1: 49 { 50 printf("请输入要在第几个节点前插入数据:"); 51 scanf_s("%d", &num); 52 printf("请输入要插入的数据:"); 53 scanf_s("%d", &data); 54 if (Insert_Node(pHead, num, data) == true) 55 { 56 printf("插入成功\n插入后的数据是:\n"); 57 TraverseList(pHead); 58 } 59 else 60 { 61 printf("插入失败\n"); 62 } 63 printf("操作完成后的数据是:"); 64 TraverseList(pHead); 65 break; 66 } 67 case 2: 68 { 69 printf("请输入要删除第几个节点的数据:"); 70 scanf_s("%d", &num); 71 return_val = Del_Node(pHead, num); 72 if (return_val == 0) 73 { 74 printf("删除失败。\n"); 75 } 76 else 77 { 78 printf("删除成功。删除的元素是:%d\n", return_val); 79 } 80 printf("操作完成后的数据是:"); 81 TraverseList(pHead); 82 } 83 default: break; 84 } 85 } 86 87 return 0; 88 } 89 90 /* 91 创建链表 92 */ 93 pNode CreateList(void) 94 { 95 int i; 96 int len; /*存放节点个数*/ 97 int val; /*用于临时存放用户输入的数据*/ 98 pNode pHead = (pNode)malloc(sizeof(Node)); /*分配一个不存放有效数据的头结点*/ 99 pNode pTail = pHead; /*链表的最后一个节点*/ 100 pTail->pNext = NULL; /*最后一个节点的指针置为空*/ 101 102 printf("请输入节点个数:"); 103 scanf_s("%d", &len); 104 for (i = 0; i < len; i++) 105 { 106 printf("第 %d 个节点的数值:", i + 1); 107 scanf_s("%d", &val); 108 pNode pNew = (pNode)malloc(sizeof(Node)); /*为节点分配空间*/ 109 pNew->member = val; /*将用户输入的数据赋给节点的成员*/ 110 pTail->pNext = pNew; /*将最后一个节点(第一次其实是pHead)的指针指向下一个新的节点*/ 111 pNew->pNext = NULL; /*将新节点中的指针置为空*/ 112 pTail = pNew; /*将新节点赋给最后的一个节点*/ 113 } 114 return pHead; /*返回头节点*/ 115 } 116 117 /* 118 遍历链表 119 */ 120 void TraverseList(pNode pHead) 121 { 122 pNode p = pHead->pNext; 123 while (NULL != p) 124 { 125 printf("%d ", p->member); 126 p = p->pNext; 127 } 128 printf("\n"); 129 return; 130 } 131 132 /* 133 链表节点插入函数 134 第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据 135 */ 136 unsigned char Insert_Node(pNode pHead, int front, int data) 137 { 138 int i = 0; 139 pNode _node = pHead; 140 pNode pSwap; 141 if ((front < 1) && (NULL != _node)) 142 { 143 return false; 144 } 145 while (i < front - 1) /*找到要插入的节点,获取该节点的指针,后面用于连接新插入的节点*/ 146 { 147 _node = _node->pNext; 148 ++i; 149 } 150 pNode pNew = (pNode)malloc(sizeof(Node)); 151 152 pNew->member = data; /*把输入的数据赋给要插入的节点*/ 153 pSwap = _node->pNext; /*把下一个节点的地址,给用于交换的pSwap*/ 154 _node->pNext = pNew; /*把要插入的节点的地址,给上个节点的指针域*/ 155 pNew->pNext = pSwap; /*把插入节点的下一个节点的地址,给插入节点的指针域*/ 156 return true; 157 } 158 /* 159 删除节点,返回被删除节点的数据 160 第一个参数是头节点,第二个参数是要删除第几个节点 161 */ 162 int Del_Node(pNode pHead, int back) 163 { 164 int i = 0; 165 int data; 166 pNode _node = pHead; 167 pNode pSwap; 168 if ((back < 1) && (NULL == _node->pNext)) 169 { 170 printf("删除失败!\n"); 171 return 0; 172 } 173 while (i < back - 1) 174 { 175 _node = _node->pNext; 176 ++i; 177 } 178 pSwap = _node->pNext; 179 data = pSwap->member; 180 _node->pNext = _node->pNext->pNext; 181 free(pSwap); /*释放申请的内存*/ 182 return data; 183 }
【调试截图】
【链表结构】
【参考】
https://www.cnblogs.com/chenxiaohei/p/6862791.html
标签:alt lib div val back 分配 bubuko style 返回
原文地址:https://www.cnblogs.com/jasming/p/10028545.html