线性表的链式表示和实现

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个元素ai与其直接后继元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据ai的存储映像称为节点。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称作指针或链。N个节点(ai(1in)的存储映像)链结成一个链表,即为线性表

a1,a2...a3)

的链式存储结构。又由于此链表的每个节点中只包含一个指针域,故又称线性链表或单链表。


-----------------线性表的单链表存储结构-----------------

typedef struct LNode{
    int date;
    struct LNode *next;
}LNode,*LinkList;

//CreatList_L

//逆序位输入n个元素的值,建立带表头节点的单链线性表L
int CreatList_L(LinkList &L,int n){
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;             //建立一个带头结点的单链表
    for(int i=n;i>0;--i){
        LNode *p;             //生成新节点
        p=(LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->date); //输入元素值
        p->next=L->next;      //插入到表头
        L->next=p;
    }
}

//ListInsert_L

//在L中第i个位置之前插入元素e
int ListInsert_L(LinkList &L,int i,int e){
    LinkList p=L;
    int j=0;
    while(p&&j<i-1){     //寻找第i-1个节点
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)        //i小于1或者大于表长加1
        return ERROR;
    LNode *s;            //生成新节点
    s=(LinkList)malloc(sizeof(LNode));
    s->date=e;           //插入L中
    s->next=p->next;
    p->next=s;
    return OK;
}

//ListDelete_L

//删除L中第i个元素并用e返回其值
int ListDelete_L(LinkList &L,int i,int &e){
    LinkList p=L;
    int j=0;
    while(p->next&&j<i-1){   //寻找第i个节点,并令p指向其前驱
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>i-1)    //删除位置不合理
        return ERROR;        //删除并释放节点
    LNode *q;
    q=p->next;
    p->next=q->next;
    e=q->date;
    free(q);
    return OK;
}

//GetElem_L

//用e返回L中第i个数据元素的值
int GetElem_L(LinkList L,int i,int &e){
    LNode *p=L->next;     //初始化,p指向第一个节点,j为计数器
    int j=1;              //顺时针向后查找,直到p指向第i个元素或p为空
    while(p&&j<i){
        p=p->next;
        ++j;
    }
    if(!p||j>i)           //第i个元素不存在
        return ERROR;     //取第i个元素
    e=p->date;
    return OK;
}

//ListLength

//返回L中数据元素个数
int ListLength(LinkList L){
    int length=0;
    LinkList p=L;
    while(p!=NULL){
        ++length;
        p=p->next;
    }
    return length;
}

//ListTraverse

//遍历L
int ListTraverse(LinkList L){
    int length=ListLength(L);
    for(int i=0;i<length-1;i++){
        printf("%d ",L->next->date);
        L=L->next;
    }
    printf("\n");
}

#include<stdio.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR 0
//main

int main(){
    LinkList L;
    int n;
    printf("Input the length of the list:\n");
    scanf("%d",&n);
    printf("Input the elem:\n");
    CreatList_L(L,n);
    printf("Now the list is:\n");
    ListTraverse(L);
    int e;
    int l1;
    printf("Input the location you want to get:\n");
    scanf("%d",&l1);
    GetElem_L(L,l1,e);
    printf("The elem you get is:%d\n",e);
    int l2;
    printf("Input the location you want to insert:\n");
    scanf("%d",&l2);
    int x;
    printf("Input the elem you want to insert:\n");
    scanf("%d",&x);
    ListInsert_L(L,l2,x);
    printf("Now the list is:\n");
    ListTraverse(L);
    int l3;
    printf("Input the location you want to delete:\n");
    scanf("%d",&l3);
    ListDelete_L(L,l3,e);
    printf("Now the list is:\n");
    ListTraverse(L);
}

---------------------结果预览-----------------


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值