数据结构 线性表的指针实现

原创 2018年04月16日 16:00:49

顺序表示即就是数组,其特点为:
优:(1)用数组存储数据元素,操作方法简单,容易实现
    (2)无须为表示结点间的逻辑关系而增加额外的存储开销
    (3)存储密度高
    (4)顺序表可按元素位序随机存取结点
缺:(1)做插入、删除操作时,需大量移动数据元素,效率非常低
    (2)要占用连续的存储空间,存储分配只能预先进行。分配过大,会导致空间浪费;分配过小将会造成数据溢出。

线性表的指针实现
是利用指针把元素中的各个元素依次连接起来,形成一个单向的链表.这样做的优点是不需要连续的存储单元存放各个元素。
因此在插入新的元素时候不需要移动其他元素为新的元素流出空位,删除表中的元素时,也不需要移动其他元素填补空位。


在初始化单链表时有两种方法,头插法和尾插法。

头插法


尾插法




#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNODE *LNode;
struct LNODE
{
    ElemType data;   //存放的数据
    LNode *next;     //指向下个节点的指针
};
void InitPointList(LNode *L){
    (*L) = (LNode *)malloc(sizeof(LNode));
    (*L)->next = NULL;
}
//头插法
void CreateListInHead(LNode *L,int x){
    LNode p;
    p = (LNode *)malloc(sizeof(LNode));
    p->data = x;
    p->next = (*L)->next;
    (*L)->next = p;
}
//尾插法
void CreateListInTail(LNode *L,int x){
    LNode p;
    p = (LNode *)malloc(sizeof(LNode));
    p->data = x;
    p->next = NULL;
    //获取最后一个元素
    LNode temp;
    temp = (*L);
    if((*L)->next == NULL){
        (*L)->next = p;
    }
    else{
        while(temp->next !=NULL){
            temp = temp->next;
        }
        temp->next = p;
    }
}
void insert(LNode *L,int x,int pos){
    LNode p;
    p = (LNode *)malloc(sizeof(LNode));
    p->data = x;
    LNode temp;
    temp = (*L);
    if (temp->next==NULL){
        (*L)->next = p;
        p->next =NULL;
    }
    else{
        for (int i = 1;i<pos;i++)
            temp = temp->next;
        p->next = temp->next;
        temp->next = p;
    }
}
void deletelist(LNode *L,int pos){
    LNode temp;
    temp = (*L);
    if (temp->next==NULL){
        printf("the list is null");
    }
    int j = 0;
    while(temp->next && j< pos - 1){
        j++;
        temp =temp->next;
    }
    if (temp->next == NULL){
        printf("the pos > list length");
        return;
    }
    LNode pn = temp->next;
    temp->next = pn->next;
    pn =NULL;
    free(pn);
  }
void ListPrint(LNode *L){
    LNode p;
    p = (*L)->next;
    while(p!=NULL){
        printf("List data = %d \n",p->data);
        p = p->next;
    }
}
void DestoryList(LNode *L){
    LNode p;
    while(*L){
        p = (*L)->next;
        (*L) = NULL;
        free(*L);
        (*L) = p;
    }
}
void clearList(LNode *L){
    LNode p,q;
    p = (*L)->next;
    while(p)
    {
      q = p->next;
      p = NULL;
      free(p);
      p = q;
    }
    (*L)->next = NULL;
}
int main()
{
    LNode L;
    InitPointList(&L);
    int a[]= {1,2,3,4,5};
    for(int i =0;i<5;i++){
        //CreateListInHead(&L,a[i]);
        CreateListInTail(&L,a[i]);
    }
    insert(&L,88,3);
    ListPrint(&L);
    deletelist(&L,3);
    ListPrint(&L);
    //DestoryList(&L);
    clearList(&L);
    if(L==NULL)
        printf("the List L is NULl");
    else
        printf("the list is not null");
    return 0;
}


注意 释放内存前 先将节点置为NULL;否则将报错  CRT detected that the application wrote to memory after end of heap buffer.
所以建议是 1、内存申请多少释放多少,释放掉你申请过的内存,不要乱释放;2、不能释放已经释放的内存;

【数据结构之线性表的顺序存储】用指针的方式实现

线性表的顺序存储实际很简单,但是本文努力将其写的更加规范。
  • smile_YangYue
  • smile_YangYue
  • 2017-02-22 21:18:39
  • 450

数据结构-线性表-头指针&头结点

链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。 这里有个地方要注意,就是对头指针概念的理解,这个很重要。 “...
  • hitwhylz
  • hitwhylz
  • 2013-10-05 10:59:47
  • 6674

使用指针实现的线性表——链表

前一小节介绍使用数组实现了线性表,这一小节使用指针来实现: 先看那12个函数: #include #include typedef int ElemType; typedef struct...
  • thefutureisour
  • thefutureisour
  • 2012-08-04 20:15:24
  • 3210

【数据结构与算法】静态链表的游标实现

以前学习的各种链表都是由指针实现的,链表中结点的分配和回收(即释放)都是由系统提供的标准函数malloc和free动态实现的,故称之为动态链表。但是有的高级语言,如BASIC、FORTRAN等,没有提...
  • mmc_maodun
  • mmc_maodun
  • 2013-09-07 23:14:54
  • 3367

数据结构之静态链表的游标表示及其实现(附完整代码)

了解过计算机高级编程语言大家族的我们都知道,并非所有的编程语言都支持指针这种数据类型。诸如BASIC、FORTRAN等许多语言都不支持指针。如果程序中需要利用链表但是又不能使用指针,那么就只能采用类似...
  • jsrcdjcyy
  • jsrcdjcyy
  • 2016-08-09 17:50:58
  • 2667

数据结构—线性结构—线性及其实现

2.1线性及其实现一、如何表示多项式方法1:顺序存储结构直接表示 这个方法用了一个数组,把数组的对应系数存了起来。这个方法的优点是:多项式相加比较好算,缺点是:下面要表示2000次的时候,要一个20...
  • zrui196988
  • zrui196988
  • 2015-08-23 18:31:10
  • 639

数据结构之线性表的链式表示和实现

//测试环境:VS2015#include "stdafx.h" #include #include//宏定义 #define ERROR 0 #define OK 1 //定义单链表的存储结构typ...
  • chengshijian2015
  • chengshijian2015
  • 2016-09-25 10:54:45
  • 978

数据结构中线性表的c语言代码实现

/*  LinkList *L定义了一个LinkList指针   LinkList *&L是指针的引用 */  #include #include typedef char ListDat...
  • lmxt520
  • lmxt520
  • 2014-08-14 15:52:13
  • 957

数据结构学习笔记(二)线性表及其C++实现

线性表基础知识以及C++实现
  • baidu_35573762
  • baidu_35573762
  • 2016-07-13 18:54:15
  • 1050

我的软考之路(三)——数据结构与算法(1)之线性

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目,它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014-04-18 07:11:28
  • 9506
收藏助手
不良信息举报
您举报文章:数据结构 线性表的指针实现
举报原因:
原因补充:

(最多只允许输入30个字)