码迷,mamicode.com
首页 > 编程语言 > 详细

2.13~用一维数组来描述线性链表

时间:2015-06-07 12:30:05      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

预备知识

1.线性表的静态单链表存储结构

#include<stdio.h>
#include<string.h>

typedef int Status ;
#define N 6
typedef char ElemType[N];
typedef struct
{
    ElemType data;
    int cur;
}SLinkList;

void main()
{
    SLinkList s[]={{"",1},{"zhao",2},{"qian",3},{"sun",4},{"li",5},{"zhou",6},{"wu",7},{"zheng",8},{"wang",0}};
    int i;
    i=s[0].cur;
    while(i)
    {
        printf("%s ",s[i].data);
        i=s[i].cur;
    }
    printf("\n");
    s[4].cur=9;
    s[9].cur=5;
    strcpy(s[8].data,"shi");//这里注意是s[8].data
    s[6].cur=8;
    i=s[0].cur;
    while(i)
    {
        printf("%s ",s[i].data);
        i=s[i].cur;
    }
    printf("\n");
}

程序运行结果如下:

技术分享

2.初始化线性表L

#include<stdio.h>

typedef int Status;
typedef int ElemType;

#define MAXSIZE 10
typedef struct
{
    ElemType data;
    int cur;
}SLinkList[MAXSIZE];

void InitList(SLinkList L)
{
    int i=1;
    L[MAXSIZE-1].cur=0;
    while(i<MAXSIZE-2)
    {
        L[i].cur=i+1;
        i++;
    }
    L[MAXSIZE-2].cur=0;
}

void main()
{
    SLinkList L;
    InitList(L);
    printf("初始化完成!\n");
}

程序运行结果如下:

技术分享

 

向线性表L中插入1~5

#include<stdio.h>
#include<string.h>

typedef int Status;
#define ERROR 0
#define OK 1


typedef int ElemType;

#define MAXSIZE 10
typedef struct 
{
    ElemType data;
    int cur;
}SLinkList[MAXSIZE];

void InitList(SLinkList L)
{
    int i=0;
    L[MAXSIZE-1].cur=0;
    while(i<MAXSIZE-2)
    {
        L[i].cur=i+1;
        ++i;
    }
    L[MAXSIZE-2].cur=0;
}

Status ListLength(SLinkList L)
{
    int j=1,i=L[MAXSIZE-1].cur;
    while(i)
    {
        ++j;
        i=L[i].cur;
    }
    return j;
}
int Malloc(SLinkList space)
{
    int i=space[0].cur;
    if(i)
        space[0].cur=space[i].cur;
    return i;
}
Status ListInsert(SLinkList L,int i,ElemType e)
{
    int l,j,k=MAXSIZE-1;
    if(i<1||i>ListLength(L)+1)
        return ERROR;
    j=Malloc(L);
    if(j)
    {
        L[j].data=e;
        for(l=1;l<i;l++)
            k=L[k].cur;
        L[j].cur=L[k].cur;
        L[k].cur=j;
        return OK;
    }
    return ERROR;
}
Status GetElem(SLinkList L,int i,ElemType *e)
{
    int l=1,k=MAXSIZE-1;
    if(i<1||i>ListLength(L))
        return ERROR;
    while(l<=i)
    {
        k=L[k].cur;
        l++;
    }
    *e=L[k].data;
    return OK;
}


    

void Free(SLinkList space ,int k)
{
    space[k].cur=space[0].cur;
    space[0].cur=k;
}
void ListTraverse(SLinkList L,void(*visit)(ElemType))
{
    int i=L[MAXSIZE-1].cur;
    while(i)
    {
        visit(L[i].data);
        i=L[i].cur;
    }
    printf("\n");
}
void print(ElemType c)
{
    printf("%d ",c);
}
void main()
{
    int j;
    Status i;
    SLinkList L;
    InitList(L);
    for(j=1;j<=5;j++)
        i=ListInsert(L,j ,j);
    printf("L=");
    ListTraverse(L,print);
}

程序运行如下:

技术分享

2.13定位线性表L中的元素位置

#include<stdio.h>
#include<string.h>

typedef int Status;
#define ERROR 0
#define OK 1


typedef int ElemType;

#define MAXSIZE 10
typedef struct 
{
    ElemType data;
    int cur;
}SLinkList[MAXSIZE];

void InitList(SLinkList L)
{
    int i=0;
    L[MAXSIZE-1].cur=0;
    while(i<MAXSIZE-2)
    {
        L[i].cur=i+1;
        ++i;
    }
    L[MAXSIZE-2].cur=0;
}

Status ListLength(SLinkList L)
{
    int j=1,i=L[MAXSIZE-1].cur;
    while(i)
    {
        ++j;
        i=L[i].cur;
    }
    return j;
}
int Malloc(SLinkList space)
{
    int i=space[0].cur;
    if(i)
        space[0].cur=space[i].cur;
    return i;
}
Status ListInsert(SLinkList L,int i,ElemType e)
{
    int l,j,k=MAXSIZE-1;
    if(i<1||i>ListLength(L)+1)
        return ERROR;
    j=Malloc(L);
    if(j)
    {
        L[j].data=e;
        for(l=1;l<i;l++)
            k=L[k].cur;
        L[j].cur=L[k].cur;
        L[k].cur=j;
        return OK;
    }
    return ERROR;
}
Status GetElem(SLinkList L,int i,ElemType *e)
{
    int l=1,k=MAXSIZE-1;
    if(i<1||i>ListLength(L))
        return ERROR;
    while(l<=i)
    {
        k=L[k].cur;
        l++;
    }
    *e=L[k].data;
    return OK;
}


    

void Free(SLinkList space ,int k)
{
    space[k].cur=space[0].cur;
    space[0].cur=k;
}
void ListTraverse(SLinkList L,void(*visit)(ElemType))
{
    int i=L[MAXSIZE-1].cur;
    while(i)
    {
        visit(L[i].data);
        i=L[i].cur;
    }
    printf("\n");
}
int LocateElem(SLinkList L,ElemType e)
{
    int j=1,i=L[MAXSIZE-1].cur;
    while(i&&L[i].data!=e)
    {
        i=L[i].cur;
        ++j;
    }
    return j;
}

void print(ElemType c)
{
    printf("%d ",c);
}
void main()
{
    int j;
    Status i;
    SLinkList L;
    InitList(L);
    for(j=1;j<=5;j++)
        i=ListInsert(L,j ,j);
    printf("L=");
    ListTraverse(L,print);
    j=LocateElem(L,3);
    printf("L中元素3所处的位置是:%d\n",j);
}

程序运行如下:

技术分享

2.14初始化线性表L

#include<stdio.h>
#include<string.h>

typedef int Status;
#define ERROR 0
#define OK 1


typedef int ElemType;

#define MAXSIZE 10
typedef struct 
{
    ElemType data;
    int cur;
}SLinkList[MAXSIZE];

void InitList(SLinkList L)  //进行初始化
{
    int i=0;
    L[MAXSIZE-1].cur=0;
    while(i<MAXSIZE-2)
    {
        L[i].cur=i+1;
        ++i;
    }
    L[MAXSIZE-2].cur=0;
}
void main()
{
    int j;
    Status i;
    SLinkList L;
    InitList(L);
    printf("成功初始化线性表L\n");
    
}
程序运行如下:

技术分享

2.14若备用空间链表非空,则返回分配的结点下标(见插入函数)

#include<stdio.h>
#include<string.h>

typedef int Status;
#define ERROR 0
#define OK 1


typedef int ElemType;

#define MAXSIZE 10
typedef struct 
{
    ElemType data;
    int cur;
}SLinkList[MAXSIZE];

void InitList(SLinkList L)
{
    int i=0;
    L[MAXSIZE-1].cur=0;
    while(i<MAXSIZE-2)
    {
        L[i].cur=i+1;
        ++i;
    }
    L[MAXSIZE-2].cur=0;
}

Status ListLength(SLinkList L)
{
    int j=1,i=L[MAXSIZE-1].cur;
    while(i)
    {
        ++j;
        i=L[i].cur;
    }
    return j;
}
int Malloc(SLinkList space)
{
    int i=space[0].cur;
    if(i)
        space[0].cur=space[i].cur;
    return i;
}
Status ListInsert(SLinkList L,int i,ElemType e)
{
    int l,j,k=MAXSIZE-1;
    if(i<1||i>ListLength(L)+1)
        return ERROR;
    j=Malloc(L);
    if(j)
    {
        L[j].data=e;
        for(l=1;l<i;l++)
            k=L[k].cur;
        L[j].cur=L[k].cur;
        L[k].cur=j;
        return OK;
    }
    return ERROR;
}

void ListTraverse(SLinkList L,void(*visit)(ElemType))
{
    int i=L[MAXSIZE-1].cur;
    while(i)
    {
        visit(L[i].data);
        i=L[i].cur;
    }
    printf("\n");
}
void print(ElemType c)
{
    printf("%d ",c);
}
void main()
{
    int j;
    Status i;
    SLinkList L;
    InitList(L);
    for(j=1;j<=5;j++)
        i=ListInsert(L,j ,j);
    printf("L=");
    ListTraverse(L,print);
}

程序运行如下:

技术分享

2.13~用一维数组来描述线性链表

标签:

原文地址:http://www.cnblogs.com/moya-com/p/4558211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!