单向链表(三) 在指定位置插入新的节点

来源:互联网 发布:sentinel1数据下载 编辑:程序博客网 时间:2024/06/15 23:45

1、要向链表中插入新的数据,就要插入一个新的节点,下面是一幅示意图:


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、运行结果:












0 0
原创粉丝点击