单向链表(三) 在指定位置插入新的节点
2014-08-01 06:33
190 查看
1、要向链表中插入新的数据,就要插入一个新的节点,下面是一幅示意图:
2、说明:原始链表为1 -> 2 -> 3 -> 4 -> NULL, 添加一个数据“5”至第3个节点,只要使第2个节点指向新节点(值为5的节点),使新节点指向原来的第3个节点(值为3的节点)就行了。
3、更通俗地讲,就是在“2”与“3”之间的“红色箭头”上添加一个”5“,红箭头变为两个蓝箭头。
4、实现函数:
或
5、main函数中调用:
6、运行结果:
2、说明:原始链表为1 -> 2 -> 3 -> 4 -> NULL, 添加一个数据“5”至第3个节点,只要使第2个节点指向新节点(值为5的节点),使新节点指向原来的第3个节点(值为3的节点)就行了。
3、更通俗地讲,就是在“2”与“3”之间的“红色箭头”上添加一个”5“,红箭头变为两个蓝箭头。
4、实现函数:
tagNode* InsertNode(tagNode *pHead, int location, int value) { tagNode *pNewHead = NULL; // 新的头结点 tagNode *pNewNode = NULL; // 新节点 tagNode *pTemp = pHead; // 临时节点 int nCount = 1; char choose = 'y'; if (pHead == NULL) { printf("链表为空!\n"); return pHead; } // 如果要插入的是头结点(location == 1) if (location == 1) { pNewHead = (tagNode *)malloc(sizeof(tagNode)); pNewHead->value = value; pNewHead->pNext = pHead; return pNewHead; } nCount++; // 插入非头结点 while (pTemp->pNext) // 注:当前节点为(pTemp->pNext),而pTemp为当前节点的前一个节点 { if(location == nCount) { // 创建一个新的节点 pNewNode = (tagNode *)malloc(sizeof(tagNode)); pNewNode->value = value; pNewNode->pNext = pTemp->pNext; // 使新节点 指向 当前节点 pTemp->pNext = pNewNode; // 使当前节点的前一节点 指向 新节点 return pHead; } else { pTemp = pTemp->pNext; nCount++; } } printf("位置%d超出链表节点数,是否添加到链表末尾(y/...):\n", location); scanf("%c", &choose); getchar(); if (choose == 'y') { // 创建一个新节点 pNewNode = (tagNode *)malloc(sizeof(tagNode)); pNewNode->value = value; pNewNode->pNext = NULL; pTemp->pNext = pNewNode; // 使 尾节点 指向 新节点 } return pHead; }
或
void InsertNode(tagNode **pHead, int location, int value) { tagNode *pNewHead = NULL; // 新的头结点 tagNode *pNewNode = NULL; // 新节点 tagNode *pTemp = *pHead; // 临时节点 int nCount = 1; char choose = 'y'; if (pHead == NULL) { printf("链表为空!\n"); return; } // 如果要插入的是头结点(location == 1) if (location == 1) { pNewHead = (tagNode *)malloc(sizeof(tagNode)); pNewHead->value = value; pNewHead->pNext = *pHead; *pHead = pNewHead; return; } nCount++; // 插入非头结点 while (pTemp->pNext) // 注:当前节点为(pTemp->pNext),而pTemp为当前节点的前一个节点 { if(location == nCount) { // 创建一个新的节点 pNewNode = (tagNode *)malloc(sizeof(tagNode)); pNewNode->value = value; pNewNode->pNext = pTemp->pNext; // 使新节点 指向 当前节点 pTemp->pNext = pNewNode; // 使当前节点的前一节点 指向 新节点 return; } else { pTemp = pTemp->pNext; nCount++; } } printf("位置%d超出链表节点数,是否添加到链表末尾(y/...):", location); scanf("%c", &choose); getchar(); if (choose == 'y') { // 创建一个新节点 pNewNode = (tagNode *)malloc(sizeof(tagNode)); pNewNode->value = value; pNewNode->pNext = NULL; pTemp->pNext = pNewNode; // 使 尾节点 指向 新节点 } }
5、main函数中调用:
int _tmain(int argc, _TCHAR* argv[]) { tagNode *p = NULL; p = CreateLinkedList(); int location; int value; printf("\n\n遍历:\n"); TraverseNodes(p); /* printf("\n\n请输入待删除的节点位置:"); scanf("%d", &location); getchar(); //p = DeleteNode(p, location); DeleteNode(&p, location); */ printf("\n\n请输入待插入的节点位置和值:"); scanf("%d %d", &location, &value); getchar(); //p = InsertNode(p, location, value); InsertNode(&p, location, value); printf("\n\n遍历:\n"); TraverseNodes(p); FreeLinkedList(p); getchar(); return 0; }
6、运行结果:
相关文章推荐
- 单向链表(二) 删除指定位置的节点
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 单向循环链表创建、遍历、插入、删除、查找(按位置,按元素值)、清空、销毁
- dom4j插入节点到指定位置
- 华为OJ——从单向链表中删除指定值的节点
- 【华为OJ】【093-从单向链表中删除指定值的节点】
- 华为OJ从单向链表中删除指定值的节点
- 华为OJ:从单向链表中删除指定值的节点
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 单向链表插入新节点
- 单向链表中,如何在给定节点前快速插入一个节点?
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 使用dom4j向xml任意指定位置插入节点
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 向升序单向链表中插入一个节点
- 单向链表之有序插入节点(C语言实现)
- 单向链表(四) 修改指定节点的数据值、逆序输出
- 数据结构:单链表(二)之链表节点排序,升序插入数据,删除指定的所有节点,翻转链表操作
- 将目标元素插入指定位置,删除子节点,替换子节点、应用之城市联动框