typedef int ElementType;
/*List.h*/
#ifndef _List_H
#define _List_H
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
List MakeEmpty( List L );
int IsEmpty( List L );
int IsLast( Position P, List L );
Position Find( ElementType X, List L );
void Delete( ElementType X, List L );
Position FindPrevious( ElementType X, List L );
void Insert( ElementType X, List L, Position P );
void DeleteList( List L );
Position Header( List L );
Position First( List L );
Position Advance( Position P );
ElementType Retrieve( Position P );
#endif /* _List_H */
/*fatal.h*/
#include <stdio.h>
#include <stdlib.h>
#define Error( Str ) FatalError( Str )
#define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 )
/////////////////
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#include "fatal.h"
struct Node
{
ElementType Element;
Position Next;
};
List MakeEmpty(List L)
{
if(L != NULL)
DeleteList(L);
L = (List)malloc(sizeof(struct Node));
if(L == NULL)
FatalError("Out of memory!");
L->Next = NULL;
return L;
}
int IsEmpty(List L)
{
return L->Next == NULL;
}
int IsLast(Position P, List L)
{
return P->Next == NULL;
}
Position Find(ElementType X, List L)
{
Position P;
P = L->Next;
while(P != NULL && P->Element != X){
P = P->Next;
}
return P;
}
void Delete(ElementType X, List L)
{
Position P, TmpCell;
P = FindPrevious(X, L);
if(!IsLast(P, L)){
TmpCell = P->Next;
P->Next = TmpCell->Next;
free(TmpCell);
}
}
Position FindPrevious(ElementType X, List L)
{
Position P;
P = L;
while(P->Next != NULL && P->Next->Element != X)
P = P->Next;
return P;
}
void Insert(ElementType X, List L, Position P)
{
Position TmpCell;
TmpCell = (List)malloc(sizeof(struct Node));
if(TmpCell == NULL)
FatalError("Out of space!");
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
void DeleteList(List L)
{
Position P, Tmp;
P = L->Next;
L->Next = NULL;
while(P != NULL){
Tmp = P->Next;
free(P);
P = Tmp;
}
}
/*
Position Header(List L)
{
return L;
}
Position First(List L)
{
return L->Next;
}
Position Advance(Position P)
{
return P->Next;
}
ElementType Retrieve(Position P)
{
return P->Element;
}
*/
////////////////////////////////////////////
/*List.c*/
void PrintList(List L)
{
Position P = L->Next;
while(P != NULL){
printf("%d\t", P->Element);
P = P->Next;
}
printf("\n");
}
List InitList(int * arr, int size)
{
List L = NULL;
L = MakeEmpty(L);
int i;
for(i = size - 1; i >= 0; i--)
Insert(*(arr+i), L, L);
return L;
}
//两个升序链表,打印tarList中的对应元素,这些元素的序号由seqList指定
void PrintLots(List tarList, List seqList)
{
int seq, i;
int lastPos = 1;
Position pSeq = seqList->Next;
Position pTar = tarList->Next;
while(pSeq != NULL && pTar != NULL){
seq = pSeq->Element;
for(i = lastPos; i < seq; i++){
pTar = pTar->Next;
lastPos++;
if(pTar == NULL){
printf("Over\n");
return;
}
}
printf("%d\t", pTar->Element);
pSeq = pSeq->Next;
}
printf("\n");
}
//使用单链表交换相邻元素
void SwapWithNext(Position BeforeP, List L)
{
Position P, AfterP;
P = BeforeP->Next;
AfterP = P->Next;
P->Next = AfterP->Next;
BeforeP->Next = AfterP;
AfterP->Next = P;
}
/*
//使用双链表交换相邻元素
void SwapWithNext2(Position P, List L)
{
Position BeforeP, AfterP;
BeforeP = P->Prev;
AfterP = P->Next;
P->Next = AfterP->Next;
BeforeP->Next = AfterP;
AfterP->Next = P;
P->Next->Prev = P;
P->Prev = AfterP;
AfterP->Prev = BeforeP;
}
*/
//已升序排序的表L1,L2,求交集
List Intersect(List l1, List l2)
{
List L = NULL;
L = MakeEmpty(L);
Position P = L;
Position P1 = l1->Next;
Position P2 = l2->Next;
while(P1 != NULL && P2 != NULL){
if(P1->Element == P2->Element){
Insert(P1->Element, L, P);
P = P->Next;
P1 = P1->Next;
P2 = P2->Next;
}
else if(P1->Element < P2->Element)
P1 = P1->Next;
else
P2 = P2->Next;
}
return L;
}
//已升序排序的链表L1,L2,求并集
List Join(List l1, List l2)
{
List L = NULL;
L = MakeEmpty(L);
Position P = L;
Position P1 = l1->Next;
Position P2 = l2->Next;
while(P1 != NULL && P2 != NULL){
if(P1->Element == P2->Element){
Insert(P1->Element, L, P);
P1 = P1->Next;
P2 = P2->Next;
}else if(P1->Element < P2->Element){
Insert(P1->Element, L, P);
P1 = P1->Next;
}else{
Insert(P2->Element, L, P);
P2 = P2->Next;
}
P = P->Next;
}
while(P1 != NULL){
Insert(P1->Element, L, P);
P1 = P1->Next;
P = P->Next;
}
while(P2 != NULL){
Insert(P2->Element, L, P);
P2 = P2->Next;
P = P->Next;
}
return L;
}
//单链表就地置逆
List Reverse(List L)
{
Position prev = NULL;
Position curr = L->Next;
Position next = curr->Next;
while(next != NULL){
curr->Next = prev;
prev = curr;
curr = next;
next = next->Next;
}
curr->Next = prev;
return curr;
}
int main()
{
int tarArr[] = {1,2,3,4,5,6,7,8,9};
int seqArr[] = {1,4,9,16};
List target = InitList(tarArr, 9);
List sequence = InitList(seqArr, 4);
PrintList(target);
PrintList(sequence);
PrintLots(target, sequence);
PrintList(Intersect(target, sequence));
PrintList(Join(target, sequence));
PrintList(Reverse(target));
return 0;
}
分享到:
相关推荐
本文将详细阐述如何使用C++来实现单链表的基本操作,包括创建、遍历、插入、删除、判断空、计算长度以及查找节点。 首先,我们从创建单链表开始。单链表是由一系列节点组成的数据结构,每个节点包含一个数据元素和...
实验二 单链表实验 一、实验目的 1、掌握用Visual C++6.0上机调试单链表的基本方法 2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现 二、实现内容 1、单链表基本操作的实现 在带头结点的...
单链表是一种基础的数据结构,它在计算机科学中扮演着重要的角色,特别是在处理动态数据集合时。单链表由一系列节点组成,每个节点包含两部分:数据域和指针域。数据域存储实际的元素值,而指针域则指向链表中的下一...
"关于有序单链表的详细设计" 本资源旨在设计和实现一个有序单链表,涵盖了需求分析、概要设计、详细设计、调试分析和测试结果等方面。下面是对该资源的知识点解析: 一、需求分析 1. 有序单链表的元素类型限定为 ...
建立一个单链表,实现单链表的初始化,插入、删除节点等功能,以及确定某一元素在单链表中的位置。 (1) 初始化单链表; (2) 依次采用尾插入法插入a,b,c,d,e元素; (3) 输出单链表L; (4) 输出单链表L的长度...
C++单链表实现大数加法 大数加法是一种常见的算法问题,特别是在C++中实现大数加法时需要考虑到数字的位数和溢出问题。使用单链表来实现大数加法可以解决这个问题。本文将详细介绍如何使用C++单链表实现大数加法。 ...
### 实验报告2 单链表的操作 #### 一、实验背景与目标 本实验的主要目的是让学生通过实际操作,理解并掌握单链表这一基本的数据结构。单链表是一种线性表,其中每个元素都是一个节点,每个节点包含两部分:存储...
### 数据结构实验:单链表的基本操作验证 #### 引言 计算机技术的核心之一在于如何高效地表示和处理信息,这一过程涉及数据的组织、存储和运算方式。数据结构与算法构成了程序设计的基石,正如N.Wirth教授所提出...
### 单链表的创建与插入 #### 一、单链表基础知识 单链表是一种基本的数据结构,其中每个元素包含两部分:数据域和指针域。数据域用于存储实际的数据,而指针域则指向下一个元素。单链表的特点在于它的线性顺序...
单链表是一种基础的数据结构,它由一系列节点组成,每个节点包含数据域和指针域,指针域指向下一个节点。在这个实验报告中,我们主要关注单链表的建立、输出、插入和删除操作。 1. **单链表的建立**: - 实现时,...
1、从键盘上依次输入21、18、30、75、42、56,逆序创建单链表,并输出单链表中的各元素值。 2、分别在单链表的第3个位置和第9个位置插入67和10,给出插入成功或失败的信息,并输出单链表中的各元素值。 3、删除...
### 单链表的创建、插入、删除 #### 概述 本文将详细介绍单链表的基本操作:创建、插入和删除。单链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含两部分:存储数据的数据域和指向下一个节点的指针...
数据结构单链表插入、删除和修改实验报告 一、实验目的 1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。 2.掌握单链表中结点结构的JAVA描述。 3.熟练掌握单链表的插入、删除和查询算法的设计与JAVA实现...
单链表是计算机科学中数据结构的基础,它是一种线性数据结构,由一系列节点(也称为元素或项)组成,每个节点包含数据以及一个指向下一个节点的引用(或称为指针)。在单链表中,数据的存储并不连续,而是通过指针...
单链表是一种基础的数据结构,它在计算机科学中扮演着重要的角色,特别是在数据存储和算法设计方面。单链表由一系列节点组成,每个节点包含数据元素以及指向下一个节点的引用,最后一个节点的引用通常为null,标志着...
线性单链表是计算机科学中一种基本的数据结构,它在程序设计中有着广泛的应用。本文将详细探讨线性单链表的概念、操作以及其实现方法。 线性单链表是一种顺序存储结构,由一系列相同类型的数据元素构成,每个元素...
### 有序单链表中的插入与删除操作 在数据结构的学习过程中,单链表是一种非常基础且重要的线性数据结构。对于单链表的操作主要包括创建、遍历、插入、删除等,而当单链表中的元素是按照一定的顺序排列时(如本例中...
单链表是一种简单但灵活的数据结构,常用于实现各种抽象数据类型,如队列、栈和映射。本教程将深入探讨如何使用Java语言来实现单链表及其相关操作。 首先,我们来理解单链表的基本概念。单链表由一系列节点组成,每...