单链表的创建_遍历_判断空_获取长度_插入_删除_排序 C语言

提示:仅做参考!!! 仅做参考!!! 仅做参考!!!

目的:通过C实现单链表的创建_遍历_判断空_获取长度_插入_删除_排序

# include <stdio.h>
# include <malloc.h>
//作者:HuXuehao
//时间:2020-12
typedef struct Node {

	int date; //数据域
	struct Node *  pNext; //指针域
}NODE, * PNODE; //NODE 等价于struct Node; PNODE等价于struct Node * ;

PNODE create_list(void); //创建了单链表
void print_list(PNODE); //遍历单链表
bool isEmpty_list(PNODE);  //判断链表是否为空
int getLength_list(PNODE); //得到链表的长度
bool insert_list(PNODE, int, int); //插入
bool delete_list(PNODE, int); //删除
void sort_list(PNODE); //排序

int main(void) {
	int opt, targ;
	int del;
	
	//创建了单链表
	PNODE pHead = NULL;
	pHead = create_list();

	//遍历单链表
	print_list(pHead);

	//判断链表是否为空
	bool ft = isEmpty_list(pHead);
	ft == false? printf("链表不为空!\n\n") : printf("该链表为空!\n\n");

	//得到链表的长度
	int len = getLength_list(pHead);
	printf("该链表的长度为:%d\n\n",len);

	//插入
	printf("向链表中插入一个数:opt= ");
	scanf("%d",&opt);
	printf("将其插入到几的后面:targ= ");
	scanf("%d",&targ);
	if(insert_list(pHead, opt, targ)) {
		printf("插入成功!\n新链表为:");
		print_list(pHead);
	}else {
		printf("插入失败\n!");
	}
	

	//删除
	printf("删除一个节点:del= ");
	scanf("%d",&del);
	if(delete_list(pHead, del)) {
		printf("删除成功!\n新链表为:");
		print_list(pHead);
	}else {
		printf("删除失败!\n");
	}
	
	//排序
	printf("\n排序后的结果:");
	sort_list(pHead);
	print_list(pHead);

	
	return 0;
}

//创建链表
PNODE create_list(void) {
	int len;
	int i;
	int val; //存放用户输入的节点的值

	//动态分配一个头节点,因为遍历的时候要用到,所以这里必须是动态的 
	PNODE pHead = (PNODE)malloc(sizeof(PNODE));  
	if(pHead == NULL) {
		printf("内存分配失败,程序终止!\n");
		//exit(-1);
	}
	PNODE pTail = pHead; //生成一个尾节点
	pTail->pNext = NULL;
	

	printf("请输入你要生成链表的长度:");
	scanf("%d",&len);
	
	for(i=0; i<len; i++) {
		printf("\n请输入第%d个节点的值:",i+1);
		scanf("%d",&val);
		PNODE pNew = (PNODE)malloc(sizeof(PNODE));  //生成一个节点
		if(pHead == NULL) {
			printf("内存分配失败,程序终止!\n");
			//exit(-1);
		}
		//生成一个节点
		pNew->date = val; //将值存放到该节点的数据域中
		pTail->pNext = pNew; //将该节点的地址存放到头(尾)结点的指针域
		pNew->pNext = NULL; //该节点的指针域为空
		pTail = pNew;  //将尾结点的指针后移
	}

	return pHead; //返回头结点,我们可以通过头结点找到所有的节点

}

//遍历链表
void print_list(PNODE pHead) {

	PNODE p = pHead->pNext; //将链表的第一个节点赋给p
	while(true) {

		if(p != NULL) { //因为下面有 p = p->pNext; 所以这里只需要判断 p是否为空就可以

			printf("%d\t",p->date);
			p = p->pNext; 
		}else {
			break;
		}
	}
	printf("\n");
	return;
}

//判断链表是否为空
bool isEmpty_list(PNODE pHead) {
	if(pHead->pNext == NULL) {
		
		return true;
	}else {
		
		return false;
	}

}

//得到链表的长度
int getLength_list(PNODE pHead) {
	int len = 0;
	PNODE p = pHead->pNext;

	while(true) {

		if(p != NULL){

			len++;
			p = p->pNext;
		}else {
			break;
		}
	}

	return len;


}

//插入操作
bool insert_list(PNODE pHead, int opt, int targ) {
	PNODE p = pHead->pNext;

	while(p != NULL) {
		if(p->date == targ) {
		
			PNODE pNew = (PNODE)malloc(sizeof(PNODE));  //生成一个节点
			pNew->date = opt;
			pNew->pNext = p->pNext;
			p->pNext = pNew;
			return true;
		}else {
		
			p = p->pNext;
		}
	}

	return false;


}

//删除一个节点
bool delete_list(PNODE pHead, int targ) {
	PNODE p = pHead;

	while(p->pNext != NULL) {
		if(p->pNext->date == targ) {
			PNODE pDel = p->pNext;
			p->pNext = p->pNext->pNext;
			free(pDel);
			pDel = NULL;
			return true;
		}else {
		
			p = p->pNext;
		}
	}

	return false;
}

//排序
void sort_list(PNODE pHead) {
	int i, j;
	PNODE p, q;
	int len = getLength_list(pHead);
	int t;
	//冒泡法
	for(i = 0, p = pHead->pNext; i < len-1; i++, p = p->pNext) {
		for(j = 0, q = pHead->pNext; j < len-1-i; j++, q = q->pNext) {
			if(q->date > q->pNext->date) {
				t = q->date;
				q->date = q->pNext->date;
				q->pNext->date = t;
			}
		}
	}
	return;
}

结果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值