带表头的单链表的创建、打印、 求长度、查找、插入、删除、释放

头文件:

#define _CRT_NO_SECURE_WARNINGS
#pragma once
/*初始化空链表、分别通过前插法/后插法创建链表、打印、
求长度、查找、插入、删除、释放*/
#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;
typedef struct node {         	     //链表结点
	ElemType data;                   //结点数据域
	struct node* link;               //结点链域
} ListNode, * LinkList;

typedef ListNode* LinkList;

void InitList(LinkList& first);
void createListF(LinkList first);
void Print(LinkList& first);/打印
int Length(const LinkList first);
void Free(ListNode* first);
//void Input(ListNode*& first);/输入
bool Find(const ListNode* first, ElemType x);/查找
ListNode* Locate(LinkList first, int i);
bool Insert(LinkList first, ElemType x, int i);
bool Delete (LinkList first, int i, ElemType& x);

cpp文件:

#include "LinkList.h"

void InitList(LinkList& first)
{
	first = new ListNode;
	first->link = NULL;

}
/创建
void createListF(LinkList first) {
	char ch; 
	LinkList r, p;
	r =first;
	r->link = NULL;
	while ((ch = getchar()) != '\n') {
		p = new ListNode;        //建立新结点
		p->data = ch;
		p->link = NULL;
		r->link =p;  //插入到表前端
		r=p;
	}
	
}


打印
void Print(LinkList& first)
{
	ListNode* p = first->link;
	for (; p; p = p->link)
		printf("%c", p->data);
	printf("\n");
}

/求长度
int Length(const LinkList first) {
	const ListNode* p;
		p= first->link;
	//检测指针 p 跳过表头结点指示第 1 号结点
	int count = 0;
	while (p ) {            //逐个结点计数
		p = p->link;   count++;
	}
	return count;
}

void Free(ListNode* first)
{
	while (first)
	{
		ListNode* p = first->link;
		delete first;
		first = p;
	}
}

bool Find(const ListNode* first, ElemType x)
{
	const ListNode* p=first->link;
	for (p = first->link; p && (p->data != x); p = p->link);
	return p != NULL;//????
}


/插入
ListNode* Locate(LinkList first, int i) {
	//返回表中第 i 个元素的地址, 表头结点为 0 号
	if (i < 0) return NULL;           // i 值不合理
	ListNode* p = first;   int k = 0;
	while (p != NULL && k < i)
	{
		p = p->link;  k++;
	}	     //找第 i 个结点 
	return p;
	//当返回地址非空则为第 i 个结点地址
	//否则返回NULL
}

bool Insert(LinkList first, ElemType x, int i) {
	//将新元素 x 插入在链表中第 i (1≤i) 号结点位置
	ListNode* p = Locate(first, i - 1);
	if (p == NULL) return 0;     //不插入
	ListNode* newNode = new ListNode;
	newNode->data = x;               //创建新结点
	newNode->link = p->link;     //链入
	p->link = newNode;
	return 1;   		//插入成功,函数返回1
}

/删除

bool Delete (LinkList first, int i, ElemType& x) {
	//将链表第 i 号元素删去, 通过 x 返回
	ListNode* p = Locate(first, i - 1);
	//寻找被删结点的前驱结点
	if (p == NULL || p->link == NULL) return 0;
	ListNode* q = p->link;	   //被删结点地址
	p->link = q->link;	             //摘下被删结点
	x = q->data;  delete q;	   //释放
	return 1;
}

main函数:

#include "LinkList.h"

void main()
{
	LinkList first;
	InitList(first);
	createListF(first);
	//Input(first);
	Print(first);
	printf("Length: %d\n", Length(first));

	if (Find(first, 'b'))
		printf("Find %c successfully.\n", 'b');
	else
		printf("Find b failed.\n");

	bool ret = Insert(first, 'e', 2);
	if (ret)
		printf("Insert %c in %d successfully.\n", 'e', 2);
	else
		printf("Insert %c in %d failed.\n", 'e', 2);
	Print(first);

	char c;
	ret = Delete(first, 2, c);
	if (ret)
		printf("Delete item at %d(%c) successfully.\n", 2, c);
	else
		printf("Delete item at %d failed.\n", 2);


	Print(first);

	Free(first);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值