数据结构之链表


表的简单数组实现:因为在定义表的时候因为表是动态空间所以会估计的大一点,从而浪费了大量的空间。在表的插入和删除的时候需要对表进行大量的遍历,所以一般不采用。

表的链表实现:链表由一系列不必在内存中相连的结构组成,每一个结构均含有表元素和指向包含该元素后继元的结构的指针。

表头所解决的三个问题:

  • 不存在从所给定义出发在表的前面插入元素的真正显性的方法
  • 从表的前面实行删除是以一个特殊的情况,因为要改变表的起始端,错误的操作会造成表的丢失
  • 在删除算法中要求记住被删除元素前面的表元

free(P)的结果是:P正在指向的地址没有变,但是该地址处的数据此时已经无定义了。所以在撤除指针的工作结束后,就不能再引用它。

双链表:通过包含一个指向前一个单元的指针即可。使得插入和删除的空间开销增加了一倍,但是简化了删除操作。
循环链表:让最后一个单元反过来直接指向第一个单元,表头可有可无。并且还可以是双向链表(第一个单元的前驱元指针指向最后的单元)

链表的先关应用:多项式ADT、基数排序、多重表
链表的游标实现:因为缺少内存的管理,因此如果运行的Find函数相对很少时游标实现的速度会显著加快

链表的优点:插入快、删除快、动态的调整数据存储大小、空间利用率高
链表的缺点:查找慢


链表的相关操作:

list.h文件

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

#ifndef _List_H

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;

//清空链表并返回
List makeEmpty(List L);
//创建一个链表
List CreateList();
//判断一个链表是否是空表
int IsEmpty(List L);
//测试当前的位置是否是链表的末尾
int IsLast(Position P, List L);
//显示当前链表
void ShowList(List L);
//更改函数
void Change(int x,int y, Position P);
//Find函数
Position Find(int x, List L);
//插入函数
void Insert(int x, List L, Position P);
//删除函数
void Delete(int x, List L);
//返回表元的前驱
Position FindPrevious(int x , List L);
//删除链表函数
void DeleteList(List L);
//返回第一个元素
Position First(List L);
//返回表头
Position Header(List L);
//返回下一个元素
Position Advance(Position P);
//返回元素的值
int Retrieve(Position P);
#endif // _List_H

//定义节点类型
struct Node
{
    int data;
    Position Next;
};

list.c文件

#include "list.h"

int IsEmpty(List L){
    return L->Next == NULL;
}

Position Find(int x,List L){
    Position P = L->Next;

    while(P != NULL && P->data != x){
        P = P->Next;
    }
    return P;
}

Position FindPrevious(int x,List L){
    Position P = L;
    while(P->Next != NULL && P->Next->data != x){
        P = P->Next;
    }
    return P;
}

void Insert(int x,List L,Position P){
    Position TmpCell;

    TmpCell = malloc( sizeof(struct Node));

    if( TmpCell == NULL){
        printf("Out of space!!");
    }

    TmpCell->data = x;
    TmpCell->Next = P->Next;
    P->Next = TmpCell;
}

void ShowList(List L){
    L = L->Next;
    while(L != NULL){
        printf("data = %d \n",L->data);
        L = L->Next;
    }
    printf("-------------------------- \n");

}
void Change(int x,int y,List L){
    Position P;
    P = Find(y,L);
    if(P->data == y){
        P->data = x;
    }
}
int IsLast(Position P, List L){
    return P->Next == NULL;
}

void Delete(int x,List L){
    Position P,TmpCell;
    P = FindPrevious(x,L);
    if(!IsLast(P,L)){
        TmpCell = P->Next;
        P->Next = TmpCell->Next;
        free(TmpCell);
    }
}
List CreateList(){
    List L = malloc(sizeof(struct Node));
        L->Next = NULL;
        return L;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值