再回首,数据结构——线性表、链表上的常见算法

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。

希望这些能提供给初学者一些参考。

//1.编写算法实现线性表就地逆置的操作
void InverseList (SeqList l)
{
	for (i = 0; i <= (l.length-1)/2; i++)
	{
		l.elem[i] <-> l.elem[l.length-1-i];
	}
}
//2.从顺序表中删除自第i个元素开始的k个元素
void DeleteList(SeqList l, int i, int k)
{
	if (i < 0 || i > l.length-1 || k < 0)
	{
			printf ("Error!");
			return;
	}
	if (i+k <= l.length)
	{
		for (j = i+k; j < l.length; j++)
			l.elem[j-k] = l.elem[j];
		l.length -= k;
	}
	else
		l.length = i;
}

//3若已建立一个带头结点的单链表,h为指向头结点的指针
//且链表中存放的数据按从小到大的顺序排列。
//编写函数实现算法,把x的值插入链表中,插入后链表保持有序
void InsertList(LinkList h, ElementType x)
{
	if (NULL == h->next)
	{
		p = (LinkList)malloc(sizeof(LinkNode));
		p->data = x;
		p->next = NULL;
		h->next = p;
	}
	pre = h->next;
	p = h;
	while (pre->next != NULL && pre->data < x)
	{
		p = pre;
		pre = pre->next;
	}
	if (NULL == pre->next && pre->data < x)
	{
		q = (LinkList)malloc(sizeof(LinkNode));
		q->data = x;
		q->next = NULL;
		pre->next = q;
	}
	else //NULL != pre->next && pre->data > x || NULL == pre->next && pre->data >= x
	{
		q = (LinkList)malloc(sizeof(LinkNode));
		q->data = x;
		q->next = pre;
		p->next = q;
	}
}

//4.假设在长度大于1的单循环链表中,既无头结点,也无头指针,
//P为指向该链表中某个节点的指针,
//编写算法,实现删除该节点的前驱节点
void DeleteLinkList(LinkList p)
{
	pre = p->next;
	while (pre->next != p)
		pre = pre->next;
	pp = pre->next;
	pre->next = pre->next->next;
	free(pp);
}

//5.设h为指向单链表头结点的指针,该链表中的值乱序
//设计算法,实现删除链表中值相同的节点,使之只保留一个
void DeleteSelectLinkList(LinkList h)
{
	p = h->next;
	if (!p)
		return;
	x = p->data;
	while (p->next)
		if (x != p->next->data)
		{
			x = p->next->data;
			p = p->next;
		}
		else
		{
			q = p->next;
			p->next = p->next->next;
			free(q);
		}
}

/*6.删除带头结点的单链表h(指向头结点)中值为x的结点的前驱结点*/
void DeleteLinkList(LinkList h, ElementType x)
{
	if (!(h->next))
		return;
	if (!(h->next->next))
		return;
	pre = h->next->next;
	p = h;
	while (pre->next && pre->data != x)
	{
		pre = pre->next;
		p = p->next;
	}
	if (x == pre->data)
	{
		q = p->next;
		p->next = pre;
		free(q);
	}
}

//注意理解
/*7.la,lb分别为表示集合A,B的带头结点的单链表的头指针,A-B(两个集合的差)由la链表返回*/
LinkList Subtraction (LinkList la, LinkList lb)
{
	LinkList pre = la->next;
	while (pre)
	{
		while (lb->next)
		{
			if (pre->data == lb->next->data)
			{
				p = pre;
				pre = pre->next;
				free(p);
			}
			lb = lb->next;
		}
		pre = pre->next;
	}
	return la;
}

/*8_1.集合A,B,C对应的顺序递增表为la,lb,lc,C=A∩B由lc表示*/
SeqList Intersection (SeqList la, SeqList lb)
{
	lc.length = 0;
	for (i = 0; i < la.length; i++)
	{
		for (j = 0; j < lb.length && la.elem[i] != lb.elem[j]; j++)
			;
		if (j < lb.length)
		{
			lc.elem[length++] = la.elem[i];
		}
	}
	return lc;
}

/*8_2.la,lb,lc分别为表示集合A,B,C的带头结点的递增有序的单链表的头指针,
  C=A∩B由lc链表返回*/
//改为有修改后的lc链表返回

LinkList Intersection (LinkList la, LinkList lb)
{
	pre = la->next;
	while (pre)
	{
		while (lb->next && pre->data != lb->data)
			lb = lb->next;
		if (lb->next)
		{
			la->next = pre;
		}
		pre = pre->next;
	}
	return la;
}

/*9删除带头结点的无序表中,元素值大于min且小于max的节点*/
void Delete (LinkList h, ElementType min, ElementType max)
{
	h = h->next;
	while (h)
	{
		if (h->data > min && h->data < max)
		{
			q = h;
			h = h->next;
			free(q);
		}
		h = h->next;
	}
}

/*10.h为带头结点的单链表的头指针,该表中含有两类字符数据元素:字母与数字,
  拆分h为两条带头结点的单项循环链表*ph1、*ph2,其中*ph1链中存放字母,
  *ph2链中存放数字*/
void Separation (LinkList h, LinkList h1, LinkList h2)
{
	if (!(h->next))
		return;
	p = h;
	h = h->next;
	free(p);

	h1 = (LinkList)malloc(sizeof(LinkNode));

	h2 = (LinkList)malloc(sizeof(LinkNode));
}
时间: 2024-10-09 10:36:39

再回首,数据结构——线性表、链表上的常见算法的相关文章

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析

#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

数据结构——线性表——链表反转

链表反转有两种常见方式.下面从图中详细解释.其中带有部分核心代码,最后上完整代码. 迭代法 //首先定义三个变量    PNODE pre = NULL;    PNODE now = pHead->pNext;    PNODE next = NULL; next = now->pNext;//先保存下一个节点 now->pNext = pre;//当前节点的next指针指向前一个节点 pre = now;//前一个节点赋值为当前节点 now = next;//当前节点赋值为下一个节点

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

《数据结构 - 线性表》链式存储 (单链表)

一:线性表定义 -<数据结构 - 线性表>顺序存储结构 二:为什么要 链式存储 线性表? - 因为在使用 顺序结构 存储方式存储的时候,每次进行 插入/删除 都需要大量移动元素的位置. - 所以设计出一种 存储空间不连续 的存储结构. - 这个线性表可能是这样的(存储位置不固定) -  三:链式存储 定义 -  因为链式存储,不是连续空间,所以需要两个信息 - 一个用于 存储数据元素,也叫做 数据域 - 一个用于 指向 下一个位置 的 指示信息,叫做指针域. - 指针域中存储的信息叫指针/链

数据结构&gt;&gt;线性表【注意】--&gt;链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目 * A.B是两个递增有序的单链表,元素个数分别是m和n,求 * 集合A-B,并将结果保存在A中,且仍然保持递增有序. * converge_ab */ #include <iostream.h> using namespace std; typedef struct lnode{ int data; struct lnode * next; }lnode; int main(){ lnode * create_chain(int num,int interval,int s

数据结构-线性表(2)

线性表定义: 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构. 存储空间是否连续: 一.顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开

C算法与数据结构-线性表的应用,多项式求和---ShinePans

/*---上机作业作业,二项式加法---*/ /*---By 潘尚 ---*/ /*---日期: 2014-5-8 . ---*/ /*---题目:---*/ //假设有两个稀疏多项式A和B,设计算法完成下列任务 //1.输入并建立多项式A和B; //2.求两个多项式的和多项式C; //3.求两个多项式的积多项式D; //输出4个多项式A,B,C,D; #include <stdio.h> #include <stdlib.h> #include <string.h>

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素