栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LinkList

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LinkList

#define _CRT_SECURE_NO_WARNINGS //屏蔽vscode2019中不可以使用scanf函数错误的


#include 
#include 
#include 


typedef struct Node {
	int data;//数据域
	struct Node* next;//指针域
} NODE, *PNODE;//NODE等价于struct Node,PNODE等价于struct Node *
//函数声明
PNODE creat_list(void);
void traverse_list(PNODE pHead);//遍历链表
bool is_empty(PNODE pHead);
int lenth_list(PNODE pHead);
bool insert_list(PNODE pHead, int pos, int val);
bool delete_list(PNODE pHead, int pos, int* pVal);
void sort_list(PNODE pHead);//冒泡排序

int main() {
	//链表的程序不仅要会还要能敲出来
	PNODE pHead = NULL;//等价于struct Node * pHead
	//头指针

	pHead = creat_list();//创建一个链表
	traverse_list(pHead);

	int lenth = lenth_list(pHead);
	printf("链表节点:%d n",lenth);

	insert_list(pHead, 2, 30);
	traverse_list(pHead);

	
	return 0;
}

PNODE creat_list(void) {
	int len;
	int val;

	printf("请输入你要生成节点个数n");
	scanf("%d", &len);

	PNODE pHead = (PNODE)malloc(sizeof(NODE));//头节点
	if (pHead == NULL) {
		printf("分配失败,程序终止运行n");//如果内存都分配失败了,
		//程序就没运行下去的必要了!
		exit(-1);
	}

	PNODE pLow = pHead;//pLow永远指向最后一个节点
	pHead->next = NULL;

	for (int i = 0; i < len; i++) {
		printf("请输入这个节点的值n");
		scanf("%d", &val);
		PNODE pNew = (PNODE)malloc(sizeof(NODE)); 
		if (pNew == NULL) {
			printf("分配失败,程序终止运行n");
			exit(-1);
		}
		pNew->data = val;//pNew数据域初始化
		pNew->next = NULL;//pNew指针域初始化
		
		pLow->next = pNew;//让pLow指向的节点的指针域等于新节点
		pLow = pNew;//让pLow永远指向尾节点
	}
	return pHead;
}

void traverse_list(PNODE pHead) {
	PNODE p = pHead->next;//这是首节点
	//pHead是头指针 
	//pHead->next,是头结点的指针域是首节点

	
	while (p != NULL) {
		printf("%d ", p->data);
		p = p->next;
	}
	printf("n");
}

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

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

void sort_list(PNODE pHead) {
	int i, j, t;
	PNODE p, q;

	int len = lenth_list(pHead);
	//这里把链表看成数组
	
	for (i = 0,p = pHead->next; i < len - 1; i++,p = p->next) {
								
		
		for (j = i + 1, q = p->next; j < len; j++, q = q->next) {
			if (p->data > q->data) {
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
		}
	}
	
}


bool insert_list(PNODE pHead, int pos, int val) {
	//pos的值要合理,要在合理节点范围
	int i = 0;
	PNODE p = pHead;
	while (p != NULL && i < pos - 1) {
		p = p->next;
		i++;
	}
	if (pos-1 < i || p == NULL) return false;
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if (NULL == pNew) {
		printf("动态分配内存失败n");
		exit(-1);
	}
	pNew->data = val;
	PNODE q = p->next;
	p->next = pNew;
	pNew->next = q;
	return true;
}

bool delete_list(PNODE pHead, int pos, int* pVal) {
	int i = 0;
	PNODE p = pHead;
	while (p->next != NULL && i < pos - 1) {
		p = p->next;
		i++;
	}
	if (pos - 1 < i || p->next == NULL) return false;
	
	PNODE q = p->next;
	*pVal = q->data;
	//删除p节点后面的节点
	p->next = p->next->next;
	free(q);
	q = NULL;

	return true;
}

个人觉得实现起来还是挺有成绩感的
有兴趣可以看一下我的另一篇ArrayList以数组为核心的线性表的实现方法

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702639.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号