您的位置:首页 > 其它

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

2014-08-01 06:33 190 查看
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、运行结果:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: