单链表操作之在当前节点前插入一个元素

***单链表操作之在当前节点前插入一个元素***




//在当前结点前插入一个元素,没有给头指针;

//定义的结点的结构体和头指针的结构体;

typedef int DataType;

typedef struct LinkNode
{
	DataType data;
	struct LinkNode* next;
}LinkNode,*pLinkNode;//结点结构体

typedef struct LinkList
{
	LinkNode* pHead;//头结点指针
}LinkList ,*pLinkList;//链表


//函数原型void InsertFrontNod(pLinkNode pos,DataType x);


// 思路分析:

/*   前面一篇文章讲的是删除一个非尾结点,紧接着这篇就是在当前前插入一个元素,也是没有告诉头指针;其实这两个问题的解法是类似的,删除非尾结点(注意: 是非尾结点),是把当前结点的后一个结点的data直接覆盖当前结点的data,然后释放后一个结点,而在当前结点前插入一个元素,也是只给了指向当前结点的指针,我们类似非尾指针做一下,首先,肯定要malloc一块新结点,如果你一直想的是怎么将newNode插到当前结点前的话,那就有点误区了,依然打它后一个位置的注意,我们将newNode插入到当前结点的后面,先将当前结点的data赋给newNode 的data,然后将当前结点的data赋为x, 不要着急创建newNode的时候就将x赋给了newNode,这样的话就省去再开辟一个临时变量;

代码实现如下:
*/

void InsertFrontNod(pLinkNode pos,DataType x)
{
	pLinkNode newNode = (pLinkNode)malloc(sizeof(LinkNode));//为新节点开辟空间;
	pLinkNode tmp = NULL;
	if(newNode == NULL)//判断是否开辟成功;
	{
		printf("out of memory\n");
		exit(0);
	}
	if(pos == NULL)//如果么有当前结点,则返回;
	{
		printf("not search of this Node!\n");
		return ;
	}

	tmp = pos->next ;
	pos->next = newNode ;
	newNode ->next = tmp;
	//以上三行为将newNode插入到当前结点后;
	newNode ->data = pos->data ;
	pos->data = x;
	//以上两行为newNode的data和当前结点data的一个互换;
}

相关文章: 单链表操作之删除一个非尾结点


你可能感兴趣的:(C/C++,数据结构,C/C++知识库)