IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021-09-08 数据结构与算法 2.2 链表(顺序链表 循环链表 双循环链表) -> 正文阅读

[数据结构与算法]2021-09-08 数据结构与算法 2.2 链表(顺序链表 循环链表 双循环链表)

目录

单链表

循环链表


单链表

头文件:

#pragma once
#include <stdio.h>
#include <stdlib.h>

typedef char datatype;//数据类型存储
typedef struct node//定义链表
{
	datatype data;
	struct node *next;
}linklist;
linklist *head,*p;//head 为头指针,p为工作指针

//头插法创建链表
linklist*Creat_Head();
//尾插法创建链表
linklist*Creat_Tail();
//尾插法建立不带头结点的单链表
linklist*Creat_None_Tail();
//按序号查找单链表
linklist*Get(linklist*head,int i);
//按照值查找
linklist*Locate(linklist*head, datatype key);
//插入单链表
linklist*Insert(linklist*head, datatype x, int i);
//将值为x的新结点插入到递增有序列表中,使得插入后该链表仍然有序
void Insert(linklist*head, datatype x);
//删除单链表
void Delete(linklist*head, int i);
//单循环链表上 将两个线性表合为一个循环列表
linklist*Connect_Tail(linklist*La, linklist*Lb);
//头指针
linklist*Connect_Head(linklist*La, linklist*Lb);

int main()
{

}

实现:

#include "单链表.h"

//头插法创建链表
linklist*Creat_Head()
{
	linklist*head, *p;
	char ch;
	head = (linklist*)malloc(sizeof(linklist));
	head->next = NULL;
	while ((ch = getchar()) != '/n')
	{
		p = (linklist*)malloc(sizeof(linklist));
		p->data = ch;
		p->next = head->next;
		head->next = p;
	}
	return head;
}

//尾插法创建链表
linklist*Creat_Tail()
{
	linklist*head, *p, *r;
	char ch;
	head = (linklist*)malloc(sizeof(linklist));
	head = NULL;
	r = head;
	while ((ch = getchar()) != '/n')
	{
		p = (linklist*)malloc(sizeof(linklist));
		p->data = ch;
		r->next = p;
		r = p;
	}
	r->next = NULL;
	return head;
}

//尾插法建立不带头结点的单链表
linklist*Creat_None_Tail()
{
	linklist*head, *p,*r;
	char ch;
	head = (linklist*)malloc(sizeof(linklist));
	head = NULL;
	r = NULL;
	while ((ch = getchar()) != '/n')
	{
		p = (linklist*)malloc(sizeof(linklist));
		p->data = ch;
		if (head->next == NULL){
			head = p;
		}else{
			r->next = p;}
		r = p;
	}
	if(r != NULL){
		r->next = NULL;
	}
		return head;
}

//按序号查找单链表
linklist*Get(linklist*head, int i)
{
	linklist*p = head;
	int j = 0;
	while (p->next != NULL && j < i)
	{
		p = p->next;
		j++;
	}
	if (i == j) { return p; }
	else { return NULL; }
}//时间复杂度为O(n)

//按照值查找
linklist*Locate(linklist*head, datatype key)
{
	linklist*p = head->next;
	while (p!= NULL&& p->data != key)
	{
		p= p->next ;
	}
	return p;
}//时间复杂度为O(n)

//插入单链表
linklist*Insert(linklist*head, datatype x, int i)
{
	linklist*p, *s;
	p = Get(head, i - 1);
	if (p == NULL) printf("非法插入位置");
	else
	{
		s = (linklist*)malloc(sizeof(linklist));
		s->data = x;
		s->next = p->next;
		p->next = s;
	}
}

//将值为x的新结点插入到递增有序列表中,使得插入后该链表仍然有序
void Insert(linklist*head, datatype x)
{
	linklist*s,*q;
	s = (linklist*)malloc(sizeof(linklist));
	s->data = x;
	s->next = NULL;
	p = head->next;
	q = head;
	while (p != NULL&&head->data <= x)
	{
		q = p;
		p = p->next;
	}
	if (p->next == NULL)q->next = s;
	else s->next = p->next; q->next = s;
}//时间复杂度为O(n)

//删除单链表
void Delete(linklist*head, int i)
{
	linklist*s;
	s = (linklist*)malloc(sizeof(linklist));
	p = Get(head, i - 1);
	if (p != NULL && p->next != NULL)
	{
		s = p->next;
		p->next = s->next;
		free(s);
	}
	else printf("非法删除位置");
}

//单循环链表上 将两个线性表合为一个循环列表
linklist*Connect_Tail(linklist*La, linklist*Lb)
{//La,Lb是两个非空循环链表的尾指针
	linklist*p = La->next;
	La->next = Lb->next->next;
	free(Lb->next);//先释放内存再合结点
	Lb->next = p;
	return Lb;
}//时间复杂度为O(1),返回值为表尾

//头指针
linklist*Connect_Head(linklist*La, linklist*Lb)
{//La,Lb是两个非空循环链表的头指针
	linklist*p = La->next;
	while (p->next != La)p = p->next;
	p->next = Lb->next;
	p = Lb->next;
	while (p->next != Lb)p = p->next;
	p->next = La;
	free(Lb);
}//时间复杂度是O(len(LA) + Len(Lb))

循环链表

头文件:

#pragma once
#include <stdio.h>
#include<stdlib.h>

typedef char datatype;
typedef struct dnode
{
	datatype data;
	struct dnode *next,*prior;
}dlinklist;
dlinklist *head;
//双向列表 每次我做的时候都感觉像是蜜雪冰城,你爱我呀我爱你

//在节点*p后插入结点*s  后插法
void DInsertAfter(dlinklist*p, datatype x);
//在节点*pqian插入节点*s 前插法
void DInsertbefore(dlinklist*p, datatype x);
//双向列表的删除
void DDelete(dlinklist*p);
//建立双向列表 头插法
dlinklist*Creat_Head();
//建立双向列表 尾插法
dlinklist*Creat_Tail();

int main()
{

}


实现:

#include "循环链表.h"

//在节点*p后插入结点*s  后插法
void DInsertAfter(dlinklist*p, datatype x)
{//在带头结点的非空双向链表中,将值为x的新节点插入*P之后
	dlinklist *s = (dlinklist*)malloc(sizeof(dlinklist));
	s->data = x;
	s->prior = p;
	s->next = p->next;
	p->next->prior = s;
	p->next = s;
}//时间复杂度为O(1)

//在节点*pqian插入节点*s 前插法
void DInsertbefore(dlinklist*p, datatype x)
{//在带头结点的非空双向链表中,将值为x的新节点插入*P之前
	dlinklist*s = (dlinklist*)malloc(sizeof(dlinklist));
	s->data = x;
	s->next = p;
	s->prior = p->prior;
	p->prior->next = s;
	p->prior = s;
}//时间复杂度为O(1)

//双向列表的删除
void DDelete(dlinklist*p)
{//在带头结点的非空向双向链表中,删除节点*p,设*p为非终端节点
	p->next->prior = p->prior;
	p->prior->next = p->next;
	free(p);
}//时间复杂度为O(1)

//建立双向列表 头插法
dlinklist*Creat_Head()
{
	dlinklist*head, *s;
	char ch;
	head = (dlinklist*)malloc(sizeof(dlinklist));
	head->next = head;
	head->prior = head;
	printf("Put any char to establish a string:\n");
	scanf("%c", ch);
	while (ch != '\n')
	{
		s = (dlinklist*)malloc(sizeof(dlinklist));
		s->data = ch;
		s->prior = head;
		s->next = head->next;
		head->next->prior = s;
		head->next = s;
		scanf("%c", ch);
	}
	return head;
}

//建立双向列表 尾插法
dlinklist*Creat_Tail()
{
	dlinklist*head, *s;
	char ch;
	head = (dlinklist*)malloc(sizeof(dlinklist));
	head->next = head;
	head->prior = head;
	printf("Put any char to establish a string:\n");
	scanf("%c", ch);
	while (ch != '\n')
	{
		s = (dlinklist*)malloc(sizeof(dlinklist));
		s->data = ch;
		s->prior = head->next;
		s->next = head;
		head->prior->next = s;
		head->prior = s;
		scanf("%c", ch);
	}
	return head;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 12:01:51  更:2021-09-09 12:04:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 0:58:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码