数据结构对链表的操作

#include <stdio.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 pHead);  //遍历链表
bool is_empty(PNODE pHead);  //判断链表是否为空
int length_list(PNODE);  //求链表长度
bool insert_list(PNODE pHead, int pos, int val);  //在pHead所指向链表的第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始
bool delete_list(PNODE pHead, int pos, int * pVal);  //删除链表第pos个节点,并将删除的结点的值存入pVal所指向的变量中,  并且pos的值是从1开始
void sort_list(PNODE);  //对链表进行排序

int main(void)
{
	PNODE pHead = NULL;
	int val;//删除的那个数
	pHead = create_list();
	traverse_list(pHead);
    printf("length %d\n",length_list(pHead));
	insert_list(pHead,3, 10);
	traverse_list(pHead);
	printf("length %d\n",length_list(pHead));
	delete_list(pHead,0,&val);
	traverse_list(pHead);
	printf("length %d\n",length_list(pHead));
	return 0;
}
PNODE create_list(void)
{
	int len;  //用来存放有效节点的个数
	int i;	//for循环的i
	int val; //用来临时存放用户输入的结点的值
	PNODE pHead = (PNODE)malloc(sizeof(NODE));//头指针指向头节点,data为NULL
	if(NULL == pHead)
	{
		printf("分配失败,程序终止");
		exit (-1);
	}
	PNODE pTail=pHead;//用来追加链表
	pTail->pNext=NULL;
	printf("请输入生成链表的个数:");
	scanf("%d",&len);
	for ( i = 0; i < len; i++)
	{
		printf("请输入第%d个节点的值: ", i+1);
		scanf("%d", &val);
		
		PNODE pNew = (PNODE)malloc(sizeof(NODE));//新节点
		pNew->data = val;//data域赋值
		pNew->pNext = NULL;//最后一个节点指针域为空
		pTail->pNext = pNew;//两个独立的节点连接起来
		pTail = pNew;//第一次循环本来pTail指向头指针,现在指向下一个节点,再为下一次循环做准备
	}
	return pHead;

}

void traverse_list(PNODE pHead)  //遍历链表
{
	PNODE p = pHead->pNext; //不能用pHead->pNext直接操作,会改动它的值
	while (NULL != p)//第一次循环时P代表第一个节点的地址
	{
		printf("%d  ",p->data);//第一次循环时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 len = 0;

	while (NULL != p)
	{
		++len;
		p = p->pNext;	
	}
   //printf("\n");
	return len;
	
}

bool insert_list(PNODE pHead, int pos, int val)
{
	PNODE p = pHead;
	if(NULL == p->pNext)
	{
		printf("The list is NULL!!!\n");
		return false;
	}
	else if (pos < 1 || pos >length_list(pHead))
	{
		printf("Please input right list length!!!\n");
		return false;
	}
	else
	{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(NULL == pNew)
		{
			printf("pNew distribute error!!!\n");
			exit (-1);
		}
		for (int i = 0; i < pos-1; i++)//pos=1,p=pHead
		{
			p = p->pNext;
		}
		pNew->data = val;
		pNew->pNext = p->pNext;
		p->pNext = pNew;
		return true;
	}
}

bool delete_list(PNODE pHead, int pos, int * pVal) //删除链表第pos个节点,并将删除的结点的值存入pVal所指向的变量中,  并且pos的值是从1开始
{
	PNODE p = pHead;
	if(NULL == p->pNext)
	{
		printf("The list is NULL!!!\n");
		return false;
	}
	else if (pos < 1 || pos >length_list(pHead))
	{
		printf("Please input right list length!!!\n");
		return false;
	}
	else
	{

		for (int i = 0; i < pos-1; i++)//pos=1,p=pHead
		{
			p = p->pNext;
		}
		*pVal = p->data;//把要删除的数传回去
		
		PNODE q = p->pNext; //要手动释放删除的空间
		p->pNext = q->pNext; 
		free(q);
		return true;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值