`
anna_zr
  • 浏览: 200498 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

单链表

 
阅读更多
        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语言实现的单链表操作的示例代码,这些代码通常会涵盖单链表的基本操作,如创建、插入、删除节点...

    单链表逆序

    单链表逆序是数据结构领域中的一个常见操作,它涉及到对链表节点顺序的反转。在本场景中,我们将详细探讨如何实现这个过程,包括单链表的基本概念、逆序算法的步骤以及如何在实际编程中应用这些概念。 首先,我们...

    单链表的实现

    单链表是一种基础的数据结构,它在计算机科学中扮演着重要的角色。单链表由一系列节点组成,每个节点包含两部分:数据元素和一个指向下一个节点的指针。这种数据结构允许快速的插入和删除操作,但随机访问的效率较低...

    PHP单链表的实现代码

    单链表是一种重要的数据结构,它在计算机科学中被广泛应用于数据存储和处理。与数组不同,链表的元素不是连续存储的,而是通过指针链接。在PHP中,我们可以用面向对象的方式来实现一个简单的单链表。 首先,单链表...

    C语言单链表实现

    单链表是计算机科学中数据结构的基础之一,它在C语言中的实现对于理解和掌握数据结构的概念至关重要。在本文中,我们将深入探讨C语言如何通过结构体和指针来实现单链表。 首先,我们需要理解单链表的基本概念。...

    单链表逆置

    ### 单链表逆置知识点解析 #### 一、单链表基础概念 单链表是一种常见的线性数据结构,其特点是每个元素节点只包含一个指向下一个元素节点的指针。这种结构使得单链表在内存中是非连续分布的,但通过节点之间的...

    单链表之头部插入节点.pdf

    单链表是一种基础的数据结构,常用于存储线性序列数据,其每个节点包含数据和一个指向下一个节点的指针。在单链表中,头部插入节点是常见的操作之一,尤其在面试和笔试中常被用来考察对数据结构的理解和编程能力。 ...

    C语言单链表实现方法详解

    C语言单链表实现方法详解 单链表是一种基本的数据结构,在C语言中实现单链表可以提高程序的效率和灵活性。本文将详细介绍C语言单链表的实现方法,包括单链表的定义、创建、添加、删除、排序、打印等操作技巧,并...

Global site tag (gtag.js) - Google Analytics