【C-数据结构与算法】单链表

1、单链表结构体定义

在这里插入图片描述

2、单链表带头结点的头插法

在这里插入图片描述

3、单链表带头结点的尾插法

在这里插入图片描述

4、查找第 i 个位置的值

在这里插入图片描述

5、按值查找

在这里插入图片描述

6、节点的插入

在这里插入图片描述

7、节点的删除

在这里插入图片描述

8、单链表的打印

在这里插入图片描述

9、完整程序

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

typedef int ElemType;
typedef struct LNode{
	ElemType data;
	struct LNode* next;// 指向下一个节点的指针,可以不使用 struct 修饰吗???不可以
}LNode,*LinkList;// LinkList 等价于 struct LNode* 

// 头插法创建带头结点的链表
LinkList CreatList1(LinkList& P_headNode) {// 头结点
	// 建立头结点
	P_headNode = (LinkList)malloc(sizeof(LNode));// 给头结点申请空间
	P_headNode->next = NULL;// 头节点的data内没存数据
	// 插入其他节点
	LNode* s;
	int x;
	scanf("%d", &x);
	// 3 4 5 6 7 9999
	while (x != 9999) {
		s = (LNode*)malloc(sizeof(LNode));// 给新节点申请一个空间
		s->data = x;
		// 头插法
		s->next = P_headNode->next;
		P_headNode->next = s;
		scanf("%d",&x);// 继续插入
	}
	return P_headNode;// 不写都没关系
}

// 尾插法创建带头结点的链表
LinkList CreatList2(LinkList& P_headNode) {
	// 初始化头结点
	P_headNode = (LinkList)malloc(sizeof(LNode));
	P_headNode->next = NULL;
	// 创建插入节点
	LNode* s, * r = P_headNode;
	int x;
	scanf("%d",&x);
	while (x != 9999) {
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d", &x);
	}
	r->next = NULL;// 尾指针的next赋值为null
	return P_headNode;
}

// 查找第几个节点的值,头结点是第0个
LNode* GetElement(LinkList& L,int i) {
	int j = 1;
	LNode* p = L->next;// 让 p 指向第一个节点
	if (i == 0)  // 第0个,就是头结点
		return L;
	if (i < 1) // i是负值表示写错了
		return NULL;

	while (p && j < i) {
		p = p->next;
		j++;
	}
	return p;
}
// 按值查询
LinkList LocateElem(LinkList& L,ElemType e) {
	LinkList p = L->next;
	while (p!= NULL && p->data != e) {
		p = p->next;
	}
	return p;
}

// 节点插入,第site个位置插入数据为data
bool ListFrontInsert(LinkList& L,int site,ElemType data) {
	LinkList p = GetElement(L,site-1);
	if (NULL == p) {
		return false;// 位置不对
	}
	LNode* n = (LNode*)malloc(sizeof(LNode));
	n->data = data;
	n->next = p->next;
	p->next = n;
	return true;
}

// 节点的删除,删除第site个位置上的节点,0开始
bool ListDelete(LinkList& L,int site) {//  可以不用引用???
	LinkList p = GetElement(L,site-1);
	if (NULL == p) {
		return false;// 删除的位置不存在
	}
	LinkList q = p->next;
	p->next = q->next;
	free(q);
	q = NULL;// 让q不会变成野指针
	return true;
}

// 链表的打印,不写引用,不是引用传递。这里的 L 是头指针的复制品【2.4一小时10分】
void printLinkList2(LinkList L) {
	L = L->next;
	while (L != NULL) {
		printf("%d", L->data);
		L = L->next;
		if (L != NULL){
			printf(" ");
		}
	}
	printf("\n");
}

int main() {
	LinkList L; // 链表头,是结构体指针类型
	
	// 头插法测试
	CreatList1(L);// 输入数据可以为 3 4 5 6 7 9999
	printLinkList2(L);
	//printLinkList2(L);
	
	// 尾插法测试
	CreatList2(L);
	printLinkList2(L);

	// 查找第几个节点测试
	LNode* n = GetElement(L, 2);
	if (n != NULL) {
		printf("%d\n",n->data);
	}

	//  按值查找测试
	LNode* n2 = LocateElem(L,6);
	if (n2) {
		printf("%d\n", n2->data);
	}

	// 插入元素测试
	ListFrontInsert(L,2,99);
	printLinkList2(L);

	// 删除元素测试
	ListDelete(L,2);
	printLinkList2(L);
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值