基于C语言实现链表

已实现的功能:创建新链表,打印链表,求结点数量,插入结点,删除结点。

//linked_list.cpp

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

//定义链表结点类型并重命名
typedef struct Node{
	int data;//数据域,数据类型暂定为int
	struct Node* pNext;//指针域
}NODE,* PNODE;//此后struct Node可简写为NODE,struct Node *可简写为PNODE

//声明
PNODE creat_list();
void traverse_list(PNODE pHead);
int length_list(PNODE pHead);
bool insert_list(PNODE pHead, int pos, int val);
bool delete_list(PNODE pHead, int pos);

int main() {
	PNODE pHead = NULL;
	pHead = creat_list();//创建一个非循环单链表,将头结点地址赋给头指针pHead
	traverse_list(pHead);//遍历输出链表每个结点
	int len = length_list(pHead);
	printf("链表结点数为%d\n", len);
	//insert_list(pHead, 6, 66);
	delete_list(pHead, 3);
	traverse_list(pHead);
	return 0;
}

//新建链表函数
PNODE creat_list() {
	int len;//有效结点数
	int i;
	int val;//临时存放用户输入的结点值
	//创建头结点
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if (pHead == NULL) {
		printf("分配失败,程序终止!");
		exit(-1);
	}
	//创建尾结点
	PNODE pTail = pHead;
	pTail->pNext = NULL;//这一步有必要吗?有必要,这里修改的是尾结点的指针域,没毛病.改写成pHead->pNext = NULL也行.
	//采集用户需求
	printf("请输入你需要生成的结点数:");
	scanf_s("%d", &len);
	//分别创建每个结点
	for (i = 0; i < len; ++i) {
		printf("请输入第%d个结点的值:", i + 1);
		scanf_s("%d", &val);
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if (pNew == NULL) {
			printf("分配失败,程序终止!\n");
			exit(-1);
		}
		pNew->data = val;
		pTail->pNext = pNew;
		pNew->pNext = NULL;
		pTail = pNew;
	}
	return pHead;
}

//遍历输出整个链表函数
void traverse_list(PNODE pHead) {
	PNODE p = pHead->pNext;//p=头结点的指针域,即首结点的地址
	while (p != NULL) {
		printf("%d ", p->data);
		p = p->pNext;
	}
	printf("\n");
}

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

bool insert_list(PNODE pHead, int pos, int val) {
	int i = 0;
	PNODE p = pHead;
	while (p != NULL && i < pos - 1) {
		p = p->pNext;
		++i;
	}
	if (i > pos - 1 || p == NULL) {
		return false;
	}
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if (pNew == NULL) {
		printf("动态内存分配失败!\n");
		exit(-1);
	}
	pNew->data = val;
	pNew->pNext = p->pNext;
	p->pNext = pNew;
	return true;
}

bool delete_list(PNODE pHead, int pos) {
	int i = 0;
	PNODE p = pHead;
	while (p->pNext != NULL && i < pos - 1) {
		p = p->pNext;
		++i;
	}
	if (i > pos - 1 || p->pNext == NULL) {
		return false;
	}
	PNODE q = p->pNext;
	p->pNext = p->pNext->pNext;
	free(q);
	q = NULL;
	return true;
}

本文代码运行环境为Visual Studio Community 2019 16.4.6版本。

代码内容主要来自郝斌老师的课程https://www.bilibili.com/video/av6159200

如有疑问或建议,欢迎留言讨论。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值