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

预备知识

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);
}

程序运行如下:

时间: 2024-10-07 02:34:28

2.13~用一维数组来描述线性链表的相关文章

例6.13 已知一个一维数组a[1..n](n&lt;25),又已知一整数m。 如能使数组a中任意几个

/*例6.13 已知一个一维数组a1..n,又已知一整数m. 如能使数组a中任意几个元素之和等于m,则输出YES,反之则为NO.[分析]对于一个已确定的数组a[1..n]和一个确定的数m,判断能否使数组a中任意几个元素之和等于m,等价于判断能否从数组a中取任意数使其和为m. 对于a中任意元素a[n]只有取与不取两种情况: (1)取a[n]: 则此时问题转化为:对于一个已确定的数组a[1..n-1]和一个确定的数m-a[n],判断能否使数组a[1..n-1]中任意几个元素之和等于m-a[n]. (

算法练习:一维数组旋转

题目描述:求一个一维数组向右旋转K个位置后的结果.比如,一维数组{1, 2, 3, 4, 5},当k = 2时,求得的结果为{4, 5, 1, 2, 3}.要求常数级空间复杂度,允许修改原有数组. 一.使用额外的空间(在不要求常数级空间复杂度的情况下) 这样很简单,使用一个额外的空间,保存原有数组的元素,然后可以错位复制原有数组 元素,即可达到题目的要求.比如数组{1, 2, 3, 4, 5},当k = 2时,先将4,5复制到结果数组,然后将1,2,3复制到结果数组的后面部分. //使用额外空间

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

数组(随机生成一维数组),二维数组的概念和题目设计(利用二维数组 :任意给定分数去计算科目和人均平均分)

1 //数组间的关系arr[]中的数字为几,[]内就有几个数 2 //{ }内的数是从0开始,如需要打印应从0开数 3 如{2,6,9,8,7}打印arr[4]就是7 4 #include <stdio.h> 5 #include <stdlib.h> 6 int main() 7 { 8 int arr[] = { 1,2,3,4,8}; 9 10 printf("%d\n", arr[3]); 11 12 system("pause");

输出 一维数组中最大的数+数组遍历

1 //将数组中最大的数输出 2 //数组遍历 3 int[] arr = new int[]{2,4,1,6,10,11}; 4 System.out.println("输出一维数组 :"); 5 for(int i=0; i<arr.length;i++) 6 { 7 System.out.print(arr[i]+" "); 8 } 9 10 System.out.println(); 11 12 int max = arr[0]; 13 for(int

C#一维数组(2)

数组是一种常用的数据类型,且属于引用类型.它是由一组相同数据类型的元素构成的.在C#语言的类型系统中,数组由抽象类System.Array派生而来的.在内存中,数组占用一块连续的内存,元素按顺序连续存放在一起,数组中每一个单独的元素并没有自己的名字,但是可以通过其位置(索引)来进行访问或修改. 在C#中,数组元素的索引是从0开始的,即对于有N个元素的数组,其索引范围是从0~N-1. 在这里重点讨论一下一位数组的使用方法. 1.一维数组的声明 数组声明时,主要声明数组的名称和所包含的元素类型,一般

poj 3624 (01背包一维数组)

①这种问题要看清楚变量范围 数组范围很容易开错!!! ②这个下限是w[i]!!!很重要 或者加一句判断  if(j-w[i]>=0)  1 for(int i=1;i<=t;i++) 2 { 3 for(int j=n;j>=w[i];j--)//下限!!! 4 dp[j]=max( dp[j] , dp[j-w[i]]+v[i] ); 5 } AC代码,一维数组可以压缩空间. 1 #include <cstdio> 2 #include <cstring> 3

结对开发Ⅴ——循环一维数组求和最大的子数组

一.设计思路 (1)数据的存储结构是链表,最后一个结点的next指向第一个元素的结点: (2)数据个数为n,则最多有n*(n+(n-1)+...+1)种情况(包括重复): (3)剩下的部分与二维数组的差不多. 二.源代码 1 // 一维数组.cpp : Defines the entry point for the console application. 2 // 袁佩佩 于海洋 3 4 #include "stdafx.h" 5 #include<iostream.h>

JAVA的 一维数组、二维数组、三维数组、多维数组等。

这个数组可以看做新手学习,从一维数组 到 多维 数组 循环渐进,其实看起也很简单,一看便知,众所周知,一维.二维或许经常用到,用到二维以上应该就很少了. public class test { public static void main(String[] args) { /*一维数组*/ int num[] = {0,1,2}; /*下面输出 3 行数据,0 ~ 2*/ for (int i = 0; i < num.length; i++) { System.out.println("