单向链表

#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>


typedef struct Node
{
	int data;				//数据存储
	struct Node * pNext;	//链表的指针,指向下一个节点
}NODE,* PNODE;				//NODE 等价于struct Node PNODE等价于struct Node*

PNODE create_list(void);//创建一个链表元素
void traverse_list(PNODE);//对链表的元素便利输出
bool is_empty(PNODE pHead);//判断链表是否为空
int  length_list(PNODE pHead);//求链表的长度
void sort_list(PNODE pHead);//对链表的数据进行排序
bool insert_list(PNODE pHead,int pos, int value);//链表在pos位置添加一个节点元素
bool delete_list(PNODE pHead,int pos, int* pValue);//链表中删除pos位置的节点

int main(void) 
{
	PNODE pHead = NULL;
	pHead = create_list();
	traverse_list(pHead);

	//sort_list(pHead);
	//traverse_list(pHead);

	insert_list(pHead,4,44);
	traverse_list(pHead);
	int v;
	delete_list(pHead,1,&v);
	traverse_list(pHead);


	/*int length = length_list(pHead);
	printf("链表的长度是:%d\n",length);
	*/


	/*
	if(is_empty(pHead)) 
	{
		printf("链表不为空!\n");
	}
	else
	{
		printf("链表为空!\n");
	}
	*/

	return 0;
}

PNODE create_list(void)
{
	int len;		//有效节点个数
	int i;
	int val;		//节点的值

	PNODE pHead = (PNODE) malloc(sizeof(NODE));
	if(pHead==NULL) 
	{
		printf("程序分配节点失败,终止运行\n");
		exit(-1);
	}
	PNODE pTail = pHead;
	pTail ->pNext = NULL;

	printf("请输入您要生成链表节点的个数: len = ");
	scanf("%d",&len);

	for(i=0;i<len;++i) 
	{
		printf("请输入第%d节点的值:val = ",i+1);
		scanf("%d",&val);
		PNODE pNew = (PNODE) malloc(sizeof(NODE));
		if(pNew==NULL) 
		{
			printf("程序分配节点失败,终止运行\n");
			exit(-1);
		}
		pNew ->data = val;
		pNew ->pNext = NULL;
		pTail ->pNext = pNew;
		pTail = pNew;
	}
	return pHead;
}

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

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


int  length_list(PNODE pHead)
{
	PNODE p = pHead ->pNext;
	int length = 0;
	while(NULL!= p) 
	{
		++length;
		p = p->pNext;
	}
	return length;
}

void sort_list(PNODE pHead)
{
	int i, j, temp;
	int length = length_list(pHead);

	PNODE p,q;
	for(i=0,p=pHead->pNext; i<length-1; p=p->pNext,i++) 
	{
		for(j=i+1,q=p->pNext;j<length;j++,q=q->pNext)
		{
			if(p->data > q->data) 
			{
				temp = p->data;
				p->data = q->data;
				q->data = temp;
			}
		}
	}
	return ;

}

bool insert_list(PNODE pHead,int pos, int value)
{
	int i =0;
	PNODE p = pHead;
	while(NULL!=p && i<pos-1)
	{
		p = p->pNext;
		++i;	
	}

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

	PNODE pNew = (PNODE) malloc(sizeof(NODE));
	if(pNew==NULL) 
	{
		printf("程序分配节点失败,终止运行\n");
		exit(-1);
	}
	pNew ->data = value;
	PNODE q = p->pNext;
	p->pNext = pNew;
	pNew->pNext = q;
	return true;

}

bool delete_list(PNODE pHead,int pos, int* pValue)
{
	int i =0;
	PNODE p = pHead;
	while(NULL!=p->pNext && i<pos-1)
	{
		p = p->pNext;
		++i;	
	}

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

	PNODE q = p->pNext;
	*pValue = q->data;
	p->pNext = p->pNext->pNext;
	free(q);
	q = NULL;
}

 

   刚开始学习数据结构,记录一下自己不熟练的C,写的链表单向链表功能,记录一下,以后可以复习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值