C 简单链表操作

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

/* 定义一个数字节点 */
typedef struct tagStNode
{
	int iData;
	struct tagStNode *pNext;
}StNode;

/* 创建iNum个节点,返回指向第一个节点的指针 */
StNode* Create(int iNum);

/* 打印 */
void Print(StNode *pstHead);

/* 将链表反转  */
StNode* Reverse(StNode *pstHead);

//void Delete(StNode *pstHead);
/* 删除链表中的第iNum个节点 */
void Delete(StNode *pstHead, int iNum);

/* 只遍历一次,求中间节点 *
 */
void SearchMid(StNode *pstHead, StNode **pstMid);

StNode* Create(int iNum)
{

	StNode *pstHead = NULL;
	StNode *pstPtr = NULL;
	StNode *pstTmpPtr = NULL;
	int iCount = 0;

	assert(iNum >= 0);
	pstHead = (StNode *)malloc(sizeof(StNode));
	assert(NULL != pstHead);
	pstHead->iData = iCount;
	pstHead->pNext = NULL;
	pstPtr = pstHead;

	for (iCount = 1; iCount < iNum; iCount++)
	{

		pstTmpPtr = (StNode *)malloc(sizeof(StNode));
		assert(NULL != pstTmpPtr);
		pstTmpPtr->iData = iCount;
		pstTmpPtr->pNext = NULL;
		pstPtr->pNext = pstTmpPtr; /* 将新建的节点挂载到前面节点后面 */
		pstPtr = pstPtr->pNext;    /* 指向下一个节点 */
	}

	return pstHead;
}

void Print(StNode *pstNode)
{
	StNode *pstPtr = NULL;

	assert(NULL != pstNode);
	pstPtr = pstNode;
	while(NULL != pstPtr)
	{
		printf("%d\n", pstPtr->iData);
		pstPtr = pstPtr->pNext;
	}

	return;
}

/*
void Delete(StNode *pstHead)
{
	StNode *pstPtr = NULL;

	assert(NULL != pstHead);
	pstPtr = pstHead;

	while (NULL != pstPtr)
	{

		free(pstPtr);

	}
}
*/

StNode* Reverse(StNode *pstHead)
{
	StNode *pstPtr1 = NULL;
	StNode *pstPtr2 = NULL;
	StNode *pstPtrTmp = NULL;

	assert(NULL != pstHead);
	pstPtr1 = pstHead;
	pstPtr2 = pstPtr1->pNext;

	while (NULL != pstPtr2)
	{
		pstPtrTmp = pstPtr2->pNext;
		pstPtr2->pNext = pstPtr1;
		pstPtr1 = pstPtr2;
		pstPtr2 = pstPtrTmp;
	}

	pstHead->pNext = NULL;
//	pstHead = pstPtr1;

	return pstPtr1;
}

void Delete(StNode *pstHead, int iNum)
{
    StNode *pstPtr1 = NULL;
    StNode *pstPtr2 = NULL;
    int iCount = 1;

	assert(NULL != pstHead);
	assert(iNum >= 0);
	pstPtr1 = pstHead;

	/* 显示ptr1指向待删除节点的前一个节点,ptr2指向待删除节点 */
	for (; iCount < iNum; iCount++)
	{
		pstPtr1 = pstPtr1->pNext;
	}
	pstPtr2 = pstPtr1->pNext;
	printf("%d %d\n", pstPtr1->iData, pstPtr2->iData);

    pstPtr1->pNext = pstPtr2->pNext;
    pstPtr2->pNext = NULL;
    assert(NULL != pstPtr2);
    free(pstPtr2);

	return ;
}

void SearchMid(StNode *pstHead, StNode **pstMid)
{
	StNode *pstPtr1 = NULL;
	StNode *pstPtr2 = NULL;

	assert(NULL != pstHead);
	pstPtr1 = pstHead;
	pstPtr2 = pstHead;

	while (NULL != pstPtr1->pNext->pNext)
	{
		pstPtr2 = pstPtr2->pNext;
		pstPtr1 = pstPtr1->pNext->pNext;
	}

	*pstMid = pstPtr2;

	return ;
}
int main(void)
{
	StNode *pstNode = Create(10);
//	StNode *pstPtr = NULL;
	StNode *pstMid = NULL;
	Print(pstNode);

//	pstPtr = Reverse(pstNode);
//	Print(pstPtr);

//	Delete(pstNode, 3);
//	Print(pstNode);

	SearchMid(pstNode, &pstMid);
	printf("MID %d\n", pstMid->iData);


	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值