单链表的算法设计

当学习完单链表后,仔细回忆回忆,单链表还是很容易掌握的,但是还是要仔细认真的品味。

单链表可以看做是由若干个结点由指针指向后继结点一种表.
结点是由数据域指针域构成。真正有效的存储是数据域,指针域负责指向下一个结点存储的位置,所以它的存储密度都是小于1,而之前学习的顺序表存储密度都是1.
那么如何定义结构体

12345
typedef struct {	Eletype data;	struct *next;//指针域}node,*Node;

那么单链表具体可以做些什么操作哪?

  1. 初始化操作,主要是对于头结点来说的,头结点一般不存储数据

    12345
    void initnNode(Node head){	head=(Node)malloc(sizeof(node));	head->next=null;}
  2. 插入结点操作,插入分为两种,头插法和尾插法
    1234567891011121314151617
    void insertData(Node head,int data){	Node temp=(Node)malloc(sizeof(node));	temp->data=data;
    
      temp->next=head->next;  head->next=temp;//时间复杂度为O(1)#else//尾插法  Node p;  p=head;  while(p->next!=NULL)//时间复杂度为O(n)此处不能用p来进行判断,若p为尾结点的话也符合条件,但是进入循环后就不符合和会发生野指针的情况  {  	p=p->next;  }  p->next=temp;  temp->next=NULL;}
  3. 查找结点操作,由于单链表需要用指针进行移动,所以不能用二分法(假设存储的数据是有顺序的)进行查找
    123456789101112131415161718192021
    void findData(Node head,int data){	Node p;	p=head;	while(p!=NULL)	{		if(p->data==data)		{			printf("已找到数据");			break;//退出循环		}		else		{			p=p->next;			if(p==NULL) 大专栏  单链表的算法设计			{				printf("未找到该数据");			}		}	}}
  4. 删除结点
    12345678910111213141516171819
    void deleteData(Node head,int data){	Node p;	p=head;	while(p!=NULL)	{		Node temp;		if(p->data==data)		{			temp=p->next;			p->next=p->next->next;			free(temp);//释放出删除的结点空间		}		else		{			p=p->next;		}	}}
  5. 删除单链表中的最大值结点
    12345678910111213141516171819
    void delMaxNode(Node head){	Node p=head->next;	Node pre=head;//p和pre是同步运动的	Node maxp=p;	Node maxpre=pre;	which(p!=NULL)	{		if(maxp->data<p->data)		{			maxp=p;			maxpre=pre;//最大值的前驱		}		pre=p;		p=p->next;	}	maxpre->next=maxp->next;	free(maxp);}
  6. 结点有序递增
    123456789101112131415161718
    void sort(Node head){	Node p,pre,q;	p=head->next->next;//p指向L的第二个数据结点	head->next->next=NULL;//构造只含一个数据结点的有序表	while(p!=NULL)	{		q=p->next;		pre=head;		while(pre->next!=NULL&&pre->next->data<p->data)		{			pre=pre->next;		}		p->next=pre->next;		pre->next=p;		p=q;	}}

解释如下图

原文地址:https://www.cnblogs.com/lijianming180/p/12251231.html

时间: 2024-08-29 17:02:42

单链表的算法设计的相关文章

单链表倒置算法

LinkList reverse(LinkList L)//单链表的倒置算法 { LNode *p,*q; p=L->next; L->next=NULL; while(p) { q=p; p=p->next; q->next=L->next; L->next=q; } return L; }

单链表的算法

要点 单链表的结构可表示如下: typedef int ElemType; typedef struct LNode { ElemType data; struct LNode* next; } LNode, *LinkList; 基本算法 插入结点 假设要在单链表的a结点和b结点之间插入一个值为x的新结点. 如下图所示,指针s指向一个值为x的结点,为了插入s. 首先让s的next指针指向b,即s->next = p->next; 然后,让a的next指针指向s,即p->next = s

单链表的算法题

单链表很简单,就是一些细节要注意. 多练练现场纸上手写. #include <iostream> using namespace std; struct node {     int key; node * next; node () : key(-1), next(NULL)  {} node (int n) : key(n), next(NULL)  {} }; void print (node * head) { while (head) { cout << head->

数据结构线性单链表的算法实现和时间复杂度分析

#include<stdio.h>#include<stdlib.h>//线性表的动态分配链式存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量#define LISTINCREMENT 10//线性表存储空间的分配增量//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef

数据结构基础(10) --单链表迭代器的设计与实现

为了向 STL 致敬(O(∩_∩)O~), 我们模仿STL中的list的迭代器, 我们也自己实现一个MyList的迭代器, 以供遍历整个链表的所有元素: 首先:Node节点需要做如下修改(注意后缀有+的代码) //链表节点 template <typename Type> class Node { friend class MyList<Type>; friend class ListIterator<Type>; //+ template <typename T

数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

一.简述 [暂无] 二.头文件 1 #ifndef _2_3_part1_H_ 2 #define _2_3_part1_H_ 3 //2_3_part1.h 4 /** 5 author:zhaoyu 6 email:[email protected] 7 date:2016-6-4 8 note:realize my textbook <<数据结构(C语言版)>> 9 */ 10 //----线性表的单链表存储结构---- 11 /** 12 My Code 13 to mak

第4章第1节练习题6 二叉树叶子节点链接成单链表

问题描述 设计一个算法,将二叉树的叶子节点按从左到右的顺序连成一个单链表,表头指针为head.链接时用叶子节点的右指针来存放单链表指针. 算法思想 题目要求将叶子节点按自左向右的次序连接成一个单链表,因此很容易考虑到的便是将整棵二叉树按照先序或中序或后序的方式遍历一次. 在遍历的过程中对叶子节点单独判断,如果是叶子节点,则将其做一个标识(比如用额外的指针指向该节点),接着遍历下一个叶子节点,遍历到另一个叶子节点后,然后让已被标识的叶子节点的右孩子指向该节点,依次类推便可以实现将叶子节点连接成单链

如何使用C++实现单链表

线性表--链表 为什么假期也在发文章 //TODO NullGirlfrindException 请忽略以上两行无聊的事实...... 如何弥补顺序表的不足之处? 第一次学习线性表一定会马上接触到一种叫做顺序表(顺序存储结构),经过上一篇的分析顺序表的优缺点是很显然的,它虽然能够很快的访问读取元素,但是在解决如插入和删除等操作的时候,却需要移动大量的元素,效率较低,那么是否有一种方法可以改善或者解决这个问题呢? 首先我们需要考虑,为什么顺序表中的插入删除操作会涉及到元素的移动呢? 好家伙,问题就

算法设计与分析 - 李春葆 - 第二版 - pdf-&gt;word v3

1 1.1 第1章─概论 2 3 1.1.1 练习题 4 1. 下列关于算法的说法中正确的有( ). 5 Ⅰ.求解某一类问题的算法是唯一的 6 Ⅱ.算法必须在有限步操作之后停止 7 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 8 Ⅳ.算法执行后一定产生确定的结果 9 A. 1个 B.2个 C.3个 D.4个 10 2. T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是( ). 11 A.T(n)= T(n-1)+1,T(1)=1 B.T(n)= 2n2 12 C.T(n)