单链表的实现

#define _CRT_SECURE_NO_WARNINGS//必须要放在第一行
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

//单链表结点的定义
typedef struct LNode {		//单链表结点类型
	ElemType data;		//数据域
	struct LNode* next;		//指针域
}LNode,*LinkList;

//头插法新建链表
LinkList CreatList1(LinkList& L) {		//list_heatd_insert
	LNode* s;
	int x;
	L = (LinkList)malloc(sizeof(LNode));		//带头结点的链表
	L->next = NULL;		//L->data里边没放东西
	scanf("%d", &x);		//从标准输入读取数据
	while (x != 9999) {
		s = (LNode*)malloc(sizeof(LNode));		//申请一个新空间给s,强制类型转换
		s->data = x;
		s->next = L->next;		//让新结点的next指针指向链表的第一个元素
		L->next = s;
		scanf("%d", &x);		//标准输入读取
	}
	return L;		//可以不写
}

//尾插法新建链表
LinkList CreatList2(LinkList& L) {		//list_tail_insert
	int x;
	L = (LinkList)malloc(sizeof(LNode));		//带头结点的链表
	LNode* s, * r = L;		//LinkList s,r=L;
	scanf("%d", &x);
	while (x != 9999) {
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;		//让尾部结点指向新结点
		r = s;		//r指向新的表尾结点
		scanf("%d", &x);
	}
	r->next = NULL;		//尾指针的next指针赋值为NULL
	return L;		//可以不写
}

//按序号查找节点值
LNode* GetElem(LinkList L, int i) {
	int j = 1;
	LNode* p = L->next;		//让p指向第一个结点
	if (i == 0)
		return L;		//i是零就返回头结点
	if (i < 1)
		return NULL;		//i是负值就返回空
	while (p && j < i) {
		p = p->next;		//让p指向下一结点
		j++;
	}
	return p;
}

//按值查找
LNode* LocateElem(LinkList L, ElemType e) {
	LNode* p = L->next;
	while (p != NULL && p->data != e)		//p && p->data != e
		p = p->next;
	return p; 
}

//新结点插入第i个位置
bool ListFrontInsert(LinkList L, int i, ElemType e) {
	LinkList p = GetElem(L, i - 1);		//拿到要插入位置的前一个位置的地址值
	if (NULL == p) {
		return false;
	}
	LinkList s = (LNode*)malloc(sizeof(LNode));		//为新插入的结点申请空间
	s->data = e;		//要插入的值放入对应空间
	s->next = p->next;		//插入步骤
	p->next = s;
	return true;
}

//删除第i个结点
bool ListDelete(LinkList L, int i) {
	LinkList p = GetElem(L, i - 1);
	if (NULL == p) {
		return false;		//要删除的位置不存在
	}
	LinkList q;
	q = p->next;
	p->next = q->next;		//断连
	free(q);		//释放对应结点的空间
	return true;
}

//打印输出链表
void PrintList(LinkList L) {
	L = L->next;
	while (L != NULL) {
		printf("%3d",L->data);		//打印当前结点数据
		L = L->next;		//指向下一个结点
	}
	printf("\n");
}

int main() {
	LinkList L;		//链表头,是结构体指针类型
	LinkList search;		//用来存储拿到的某一个结点
	CreatList1(L);		//输入数据可以为3 4 5 6 7 9999(头插)
	//CreatList2(L);		//输入数据可以为3 4 5 6 7 9999(尾插)
	PrintList(L);		//链表打印

	search = GetElem(L, 2);		//按位序查询
	if (search != NULL) {
		printf("按序号查找成功\n");
		printf("%d\n", search->data);
	}

	search = LocateElem(L, 6);		//按值查询
	if (search != NULL) {
		printf("按值查找成功\n");
		printf("%d\n", search->data);
	}

	ListFrontInsert(L, 2, 99);		//新结点插入第i个位置
	PrintList(L);

	ListDelete(L, 4);		//删除第四个结点
	PrintList(L);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值