单链表的创建输入查找求长度插入删除释放…

实现单链表的初始化,创建,输入,打印出它结点的数据域,求长度,查找某个值在不在其中,插入结点(表头、中间或结尾都可以),删除结点,释放整个链表。

先建框架,写头文件Linkling.h:

#define  _CRT_SECURE_NO_WARNINGS//防止scanf报错
#include<stdio.h>
#include<stdlib.h>

#pragma once
/*单链表创建、输入、打印、
求长度、查找、插入、删除、释放*/

//1链表的存储结构
typedef int ElemType;
typedef struct LNode {       //链表结点
    ElemType data;           //node数据域
    struct LNode* next;        //node链域
} LNode,   *LinkList;

typedef LNode* LinkList;   //链头指针
//使用时定义实际链表,只需定义链表头指针

//2初始化
void InitList(LinkList& L);
//3创建可输入值的链表
void  CreateList_Tail(LinkList L, int n);
//4打印链表的值
void Print(LinkList& L);
//5求长度
int Len(const LinkList L);
//6查找
LinkList Find(const LinkList L, ElemType x);
//7插入
bool Insert(LinkList& L, ElemType y, int i);
//8删除
bool Delete(LinkList& L, int di, ElemType& z);
//9释放
void FreeList(LinkList& L);

现在就来添砖加瓦,好好搬砖,写个LinkedList的源文件:

#include"LinkedList.h"

void InitList(LinkList& L)
{
	L = new LNode;
	L->next = NULL;
	
}

void CreateList_Tail(LinkList L, int n) {
	LinkList r, p;
	r = L;
	r->next = NULL;
	int a;
	for (int i = 0; i < n; ++i) {
		p = new LNode;
        scanf("%d", &a);
		p->data = a;
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

void Print( LinkList& L)
{
	LNode* p = L->next;
	while(p) {
		printf("%d\t", p->data);
		p = p->next;
	}
	printf("\n");
}

int Len(const LinkList L)
{
	LinkList p;
	p = L->next;
	int count = 0;
	while (p) {
		p = p->next;
		count++;
	}
	return(count);
}

LinkList Find(const LinkList L, ElemType x)
{
	
	LinkList p;
	p = L->next;
	int k = 1;
	while (p && p->data != x)
	{
		p = p->next;
		k++;
	}
	if (p == NULL)
	 printf("%d is not in list\n",x);
	else printf("%d在第%d个结点\n",x, k);
	printf("%d", L->data);
	return p;
}
bool Insert(LinkList& L, ElemType y, int i) {
	//使插入的y成为第i个结点的值,第一个i就是1了,不是0哦
	LinkList p = L;  
	int k = 0;
	while (p  && k < i - 1)
	{
		p = p->next;  k++;
	}            //找第 i-1个结点 
	if (p == NULL && L != NULL) {
		printf("无效的插入位置!\n");
		return 0;			      //给的 i 太大
	}
	LinkList newnode = new LNode;
	//创建新结点
	newnode->data = y;
	if (L == NULL || i == 0) {     
		newnode->next = L;
		L = newnode;
	}     //L 定义为引用型 
	else {                                  //插在表中或末尾
		newnode->next = p->next;
		p->next = newnode;
	}
	return 1;
}
bool Delete(LinkList& L, int di, ElemType& z) {
	/*在链表中删除第 i 个结点。如果要删除表中第1个结点,需要改变表头指针,所以 L定义为引用
	型,被删元素的值通过引用型参数 x 返回*/
	if (!L) return 0;
	LinkList p, q;
	if (di == 0)             		//删除表中第 1 号结点
	{
		q = L->next;
	}
	else {
		p = L;  int k = 0;       	//找第 i-1个结点
		while (p && k < di - 1)
		{
			p = p->next;
			k++;
		}
		if (p == NULL || p->next == NULL) {
			printf("无效的删除位置!\n");
			return 0;
		}
		else {                         //删除表中或表尾元素
			q = p->next;       //重新链接
			p->next = q->next;
		}
		z = q->data;
		delete q;        //删除q
		return 1; 	        //delete作用与free相同	
	}
}
void FreeList(LinkList& L) {
	LNode * current = L;
	if (current == NULL) {
		printf("List is empty\n");
		return;
	}
	while (L) {
		current = L;
		if (!L->next) {
			break;
		}
		L = L->next;
		free(current);
	}
	printf("free done!");
	
}

最后,再建一个主函数main.cpp就可以来运行了:

#include"LinkedList.h"
int main() {
	LinkList L;
	InitList(L);
	printf("input 3 integers and click'Enter':");//这里也可以自己做个scanf输入n的值,和下面的y,z一种办法。
	CreateList_Tail(L, 3);
	printf("list now:\n"); Print(L); printf("\n");
	printf("length of list:%d\n", Len(L)); printf("\n");
	ElemType x;
	printf("input the value you want to find in the list:");
	scanf("%d", &x);
	Find(L, x);
	ElemType y; int i;
	printf("input the value you want to insert and the order:'v,o':");
	scanf("%d,%d", &y,&i);//这里输入时中间要加逗号
	Insert(L, y,i);
	printf("inserted list:\n");
	Print(L);
	printf("\n");
	ElemType z; int di;
	printf("input the order of the delete elem:");
	scanf("%d", &di);
	Delete(L, di, z);
	printf("deleted list:\n");
	Print(L);
	printf("\n");
	FreeList(L);
	return 0;
}

OK!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值