cpp 单链表基本操作

单链表的结构体 定义:

#include <stdio.h>
#include <malloc.h>

typedef struct LNode{
	int data;
	struct LNode* next;
}LNode, * LinkList;
//定义 * LinkList 的意义?

单链表 头插法:

//单链表 头插法
LinkList createToH(LinkList L) {
	LNode* s;	int x;	//s指向当前要插入的结点
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	scanf_s("%d", &x);
	while (x != -1) {
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
//结构体声明写typedef struct LNode,否则报错
		L->next = s;	
		scanf_s("%d", &x);
	}
	return L;
}

单链表 尾插法:

//单链表 尾插法
LinkList createToR(LinkList L){
	L = (LinkList)malloc(sizeof(LNode));
	//r始终指向尾结点,初始指向L,即头结点
	LNode* r = L;
	LNode* s;	int x;
	scanf_s("%d", &x);
	while (x != -1) {
		s = (LinkList)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf_s("%d", &x);
	}
	//!!!记得:将尾指针的next置为NULL
	r->next = NULL;
	return L;
}

单链表 打印:

void printLNode(LNode* node) {
	//L应该指向node->next    !!
	LinkList L = node->next;
	//循环条件为 L!=NULL       !!
	while (L) {
		printf("%d\n",L->data);
		L = L->next;
	}
}

 按序号查找:

//!按序号查找
LinkList findByID(LinkList L,int id) {
	//查找的id从1开始计数
	int j=1;
	LinkList p = L->next;
	if (id < 0)	return NULL;
	//若id=0,说明是查找的头结点
	if (id == 0)return L;
	//循环条件:p不为空
	//若为NULL说明已遍历完成
	while (p&&j<id) {
		p = p->next;
		j++;
	}
	return p;
}

 按值查找:

//按值查找
LinkList findByElem(LinkList L, int e) {
	LinkList p = L->next;
	while (p && p->data != e) {
		p = p->next;
	}
	return p;
}

插入结点:

//插入结点 (前插)1开始计数
LinkList insert(LinkList L, int i, int e) {
	//s指向要插入的结点
	//p指向要插入的第i个结点的前一个结点,1开始计数
	LinkList s, p;
	p = findByID(L, i - 1);
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return L;
}

删除结点:

 

//删除结点	删除第i个结点 1开始计数
LinkList deleteElem(LinkList L, int i) {
	//p指向第i-1个结点
	LinkList p = findByID( L ,i - 1);
	//s指向被删除的结点
	LinkList s = p->next;
	//或p->next=s->next;
	p->next = p->next->next;
	free(s);
	return L;
}

main函数:

int main() {
	LNode node;
	LinkList L;
	// 1 2 3 4 -1
	//L = createToH(&node);
	L = createToR(&node);
	printLNode(L);
//按序号查找
	//LinkList result1 = findByID(L, 4);
//按值查找
	//LinkList result2 = findByElem(L, 1);
	//printf("%d\n", result2->data);
	printf("inserting..........\n");
	L = insert(L, 4, 100);
	printLNode(L);

	printf("deleting............\n");
	L = deleteElem(L, 5);
	printLNode(L);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值