单链表的定义和基本操作 c++

单链表 c++(数据结构 )

链表是一种动态数据结构,它的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。
链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。
链表很基础,很重要!!!

头文件:函数的声明,

//linklist.h
#pragma once
#include<iostream>
#include<stdlib.h>
#include<ctime>
using namespace std;
typedef int elemtype;
class node {
public:
	elemtype data;
	class node *next;
};
typedef node *linklist;


//单链表的整表创建:头插法
void creat_headlist(linklist &l, int n);


//创建链表:尾插法
void creat_taillist(linklist &l, int n);


//判空
bool isempty(linklist l);


//获取长度
int len_list(linklist l);

//读取第i个元素
int getelem(linklist l, int i, elemtype &e);

//删除第i个元素,并用e返回
int dele_list(linklist &l, int i, elemtype &e);


//打印链表
void show_list(linklist l);


//在第i个元素插入e
int insert_list(linklist &l, int i, elemtype e);
//清空链表
void clear_list(linklist &l);

函数的定义:

//linklist.cpp
#include"linklist.h"

//单链表的整表创建:头插法
void creat_headlist(linklist &l, int n)
{
	node* p;
	srand(time(0));
	l = (linklist)malloc(sizeof(node));
	(l)->next = NULL;
	for (int i = 0; i < n; i++)
	{
		p = (linklist)malloc(sizeof(node));
		p->data = rand() % 100 + 1;
		p->next = (l)->next;
		(l)->next = p;
	}
}


//创建链表:尾插法
void creat_taillist(linklist &l, int n)
{
	linklist p, r;

	srand(time(0));
	l = new node;
	r = l;
	for (int i = 0; i < n; i++)
	{
		p = new node;
		p->data = rand() % +1;
		r->next = p;
		r = p;
	}
	r->next = NULL;
}

//判空
bool isempty(linklist l)
{

	if (l->next == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//获取长度
int len_list(linklist l)
{
	int len = 0;

	if (isempty(l))
		return 0;
	else
	{
		while (l->next) {
			len++;
			l = l->next;
		}
		return len;
	}
}
//读取第i个元素
int getelem(linklist l, int i, elemtype &e)
{
	linklist p;
	int j = 1;
	p = l->next;
	while (p&&j < i)
	{
		p = p->next;
		j++;
	}
	if (i < j || !p)
	{
		return 0;
	}

	e = p->data;
	return 1;
}
//删除第i个元素,并用e返回
int dele_list(linklist &l, int i, elemtype &e)
{
	linklist p, q;
	p = l;
	if (isempty(l) || i<1 || i>len_list(l))
	{
		return 0;
	}
	else
	{
		int k = 1;
		while (p->next && k < i)//找到被删结点的前一个结点
		{
			p = p->next;
			k++;
		}
		e = p->next->data;
		q = p->next;
		p->next = q->next;
		delete  q;

		return 0;
	}

}

//打印链表
void show_list(linklist l)
{
	linklist p = l;
	if (isempty(l) == false)
	{
		cout << "输出链表" << endl;
		for (p = l->next; p != nullptr; p = p->next)
		{
			cout << p->data << "--";
		}
		cout << endl;
	}
	else
	{
		cout << "链表为空" << endl;
	}
}

//在第i个元素插入e
int insert_list(linklist &l, int i, elemtype e)
{
	if (i<1 || i>len_list(l)) {
		return 0;
	}
	else {
		int k = 1; node *p, *q;
		q = l;
		p = new node;
		p->data = e;

		while (k < i) {				//第i-1个元素
			k++;
			q = q->next;
		}

		p->next = q->next;
		q->next = p;

	}
	return 1;

}
//清空链表
void clear_list(linklist &l)
{
	linklist p,q; 
	p = l->next; //指向第一个结点
	while (p != NULL)		//没到表尾
	{
		q = p->next;      //将下一个结点备份
		l->next = p->next;
		delete p;
		p = q;
	}
	l->next = NULL;//头结点指针为空
}

main函数测试:

//test.cpp
#include"链表定义.h"
int main()
{
	linklist l2;

	creat_headlist(l2, 5);
	int a; int e;
	getelem(l2, 2, a); cout << a << endl;
	cout << len_list(l2) << endl;
	 show_list(l2);
	 dele_list(l2, 3,e);
	 cout << e << endl;
	 show_list(l2);
	 insert_list(l2, 3, 7);
	 show_list(l2);
	 clear_list(l2);
	 show_list(l2);
	system("pause");
		return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常见的数据结构,它由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。 以下是单链表基本操作算法示例(使用C++语言): ```cpp #include <iostream> // 定义单链表节点的结构 struct ListNode { int data; ListNode* next; ListNode(int val) : data(val), next(nullptr) {} }; // 向链表末尾插入一个节点 void insert(ListNode*& head, int val) { ListNode* newNode = new ListNode(val); if (head == nullptr) { head = newNode; } else { ListNode* curr = head; while (curr->next != nullptr) { curr = curr->next; } curr->next = newNode; } } // 删除链表指定值的节点 void remove(ListNode*& head, int val) { ListNode dummy(0); dummy.next = head; ListNode* prev = &dummy; ListNode* curr = head; while (curr != nullptr) { if (curr->data == val) { prev->next = curr->next; delete curr; curr = prev->next; } else { prev = curr; curr = curr->next; } } head = dummy.next; } // 遍历打印链表的所有节点值 void printList(ListNode* head) { ListNode* curr = head; while (curr != nullptr) { std::cout << curr->data << " "; curr = curr->next; } std::cout << std::endl; } int main() { ListNode* head = nullptr; // 插入节点 insert(head, 1); insert(head, 2); insert(head, 3); insert(head, 4); // 打印链表 std::cout << "链表内容:"; printList(head); // 删除节点 remove(head, 2); // 再次打印链表 std::cout << "删除节点后的链表内容:"; printList(head); return 0; } ``` 这段代码演示了如何创建一个单链表,向链表末尾插入节点,删除链表的指定节点,并遍历打印链表的所有节点值。你可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值