链表相关操作一

#include<iostream>
#include<malloc.h>
#include<stdlib.h>

typedef struct Node//定义链表结点
{
	int data;//数据域
	struct Node* pNext;//指针域
}NODE,*PNODE;//NODE等价于struct Node,PNODE等价于struct Node*;Node主要用于malloc函数

PNODE createLinkList(void);//创建链表函数
void traverseLinkList(PNODE pHead);//遍历链表函数
bool isEmpty();//判断链表是否为空
int getLength(PNODE pHead);//获取链表的长度
bool insertElement(PNODE pHead,int pos,int *pVal);//插入元素,参数依次为链表头结点,插入位置,插入值
bool deleteElement(PNODE pHead,int pos,int *pVal);//删除元素,参数依次为链表头结点,删除位置,删除值
void sort(PNODE pHead);//对链表中的元素进行排序(基于冒泡排序)
void reverseLinkList(PNODE *head);//对链表进行逆转

PNODE createLinkList()
{
	int length;//有效结点的长度
	int i;
	int value;//用来存放用户输入结点的值

	PNODE pHead = (PNODE)malloc(sizeof(NODE));//创建一个不存放数据的头结点
	if(NULL == pHead)
	{
		printf("内存分配失败,程序退出!\n");
		exit(-1);
	}

	PNODE pTail = pHead;//pTail始终指向尾结点
	pTail->pNext = NULL;//清空指针域
	printf("请输入你想创建的结点个数:len=");
	scanf("%d",&length);

	for(i=0; i<length; i++)
	{
		printf("请输入第%d个结点的值:",i+1);
		scanf("%d",&value);
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(NULL==pNew)
		{
			printf("内存分配失败,程序退出!\n");
			exit(-1);
		}

		pNew->data = value;//向新结点值中放入值
		pTail->pNext = pNew;//将尾结点指向新结点
		pNew->pNext = NULL;//将新节点的指针域清空
		pTail = pNew;//将新节点赋给pTail,使pTail始终指向为尾结点
	}
	return pHead;
}

void traverseLinkList(PNODE pHead)
{
	PNODE p = pHead->pNext;
	while(NULL != p)
	{
		printf("%d\n",p->data);
		p=p->pNext;
	}
	printf("\n");
	return;
}

bool isEmpty(PNODE pHead)
{
	if(NULL == pHead->pNext)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int getLength(PNODE pHead)
{
	PNODE p = pHead->pNext;
	int len = 0;
	while(NULL != p)
	{
		len++;
		p=p->pNext;
	}

	return len;
}

void sort(PNODE pHead)
{
	int len = getLength(pHead);//获取链表的长度
	int i,j,t;
	PNODE p,q;

	for(i=0,p=pHead->pNext; i<len-1; i++,p=p->pNext)//i,j与p,q平行操作
	{
		for(j=i+1,q=p->pNext;j<len; j++,q=q->pNext)
		{
			if(p->data >q->data)
			{
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
		}
	}
}

bool insertElement(PNODE pHead,int pos,int val)
{
	int i=0;
	PNODE p = pHead;
	while(NULL !=p && i<pos-1)//判断p是否为空并且是p最终指向pos的位置的结点,从头结点开始计数
	{
		p=p->pNext;
		i++;
	}

	if(NULL == p)
		//if(NULL == p || i>pos-1)
	{
		return false;
	}

	PNODE pNew  = (PNODE)malloc(sizeof(NODE));
	if(NULL == pNew)
	{
		printf("内存分配失败,程序退出\n");
		exit(-1);
	}

	pNew->data = val;

	PNODE q = p->pNext;//定义一个临时结点,指向当前p的下一节点
	p->pNext = pNew;//将p指向新的结点
	pNew->pNext = q;

	return true;
}

bool deleteElement(PNODE pHead,int pos,int *pVal)
{
	int i=0;
	PNODE p = pHead;

	while(NULL != p->pNext && i<pos-1)//判断p是否为空并且是p最终指向pos的位置的结点
	{
		p=p->pNext;
		i++;
	}

	if(NULL == p->pNext)
		//if(NULL == p->pNext || i>pos-1)
	{
		return false;
	}

	*pVal = p->pNext->data;//保存要删除的结点
	PNODE q = p->pNext;
	p->pNext = p->pNext->pNext;//删除后面的结点
	free(q);
	q=NULL;

	return true;
}

void reverseLinkList(PNODE head)
{
	NODE *p,*q,*r;
	p = head->pNext;
	if(p==NULL || p->pNext==NULL)
	{
		return;//说明没有元素或只有一个元素
	}
	q = p->pNext;
	while(q)
	{
		r = q->pNext;
		p->pNext = r;//将q删除

		q->pNext = head->pNext;//将q插入到第一个结点
		head->pNext = q;

		q = r;
	}
}
int main()
{
	int val;//用于保存删除的元素
	PNODE pHead = NULL;//PNODE等价于struct Node*;
	pHead = createLinkList();//创建非循环单链表,并将该链表的头结点地址赋给pHead
	traverseLinkList(pHead);//调用遍历函数
	if(isEmpty(pHead))
	{
		printf("链表为空\n");
	}
	else
	{
		printf("链表不为空\n");
	}

	printf("链表的长度为%d\n",getLength(pHead));
	sort(pHead);//调用冒泡排序函数
	traverseLinkList(pHead);
	if(insertElement(pHead,4,30))
	{
		printf("插入成功,插入的元素为%d\n",30);
	}
	else
	{
		printf("插入失败.\n");
	}
	traverseLinkList(pHead);

	if(deleteElement(pHead,3,&val))
	{
		printf("删除成功,删除的元素为:%d\n",val);
	}
	else
	{
		printf("删除失败\n");
	}

	traverseLinkList(pHead);
	reverseLinkList(pHead);
	traverseLinkList(pHead);
	system("pause");

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值