链表的顺序实现

//线性顺序表的简单实现
// 在这里要说的是代码讲究的是随机应变,,写代码讲究的是随意二字,
// 一种需求你也许有几十种的办法实现,对代码要理解,,随性,,,,,

#include <cstdio>
#include <cstdlib>
//#define _OJ_
#define initlist_size 100
#define increament 10

typedef struct Lnode
{
    int *elem;
    int List_size;//当前分配的存储容量
    int length;
}List;

void
init_List(List *L)
//创建一个顺序表
{
    L->elem = (int*) malloc (initlist_size * sizeof(int));
    L->length = 0;
    L->List_size = initlist_size;
}

void
inputlist(List *L, int n)
{
    int i;
    for(i = 0;i < n; i++) {
    scanf("%d", &L->elem[i]);
     }
     L->length = n;
}

int
list_length(List *L)
{
    return L->length;
}

void
List_delete(List *L, int i)
//删除第i个元素
{
    int j;
    if((i >= 1)  || i <= L->length)
    {
    for(j = i - 1;j < L->length; j++)
    L->elem[j] = L->elem[j + 1];
    }
    --L->length;
}

void
List_delete(List *L, int i)
//删除第i个元素
{
    int *p, *q;
    if((i >= 1) || i <= L->length)
    {
    p = &(L->elem[i - 1]);
    q = L->elem + L->length - 1;
    for(p;p <= q; p++)
    *p = *(p + 1);
    }
    --L->length;
//删除的第二个版本,依个人之鄙见,严奶奶的书中这种写法不好,
// 顺序表与链表的区别就是指针,,而这种写法用了大量指针,,
    // 不能与之明显的比较
}

void
List_insert(List *L, int i, int x)
//在第I个元素后插入元素x
{
    int j;
    if(i <= L->length)
    {
    for(j = L->length - 1;j >= i; j--)
        L->elem[j + 1] = L->elem[j];
    L->elem[i] = x;
    }
    ++L->length;
}

void
List_insert(List *L, int i, int x)
//在第I个元素后插入元素x
{
    int *newbase;
    int *p, *q;
    if(L->length >= initlist_size)
    {
    newbase =
    (int*) realloc (L->elem, (initlist_size + increament) * sizeof(int));
    L->elem = newbase;
    L->length = initlist_size + increament;
    }

if(i <= L->length)
    {
    p = &(L->elem[i]);
    q = L->elem + L->length - 1;
    for(q;q >= p; q--)
    *(q + 1) = *q;
    *p = x;
    }
    ++L->length;
    //插入的第二个版本,依个人之鄙见,严奶奶的书中这种写法不好,
// 顺序表与链表的区别就是指针,,而这种写法用了大量指针,,
    // 不能与之明显的比较
}

void
List_union(List *La, List *Lb, List *Lc)
//实现顺序表的合并
{
    int i = 0, j = 0, k = 0;
    Lc->length = La->length + Lb->length;
    while(i < La->length && j < Lb->length)
    {
    if(La->elem[i] <= Lb->elem[j])
    {Lc->elem[k] = La->elem[i]; i++;    k++;}
    else{
    Lc->elem[k] = La->elem[j]; j++;    k++;
    }
    }

while (i < La->length) {
      Lc->elem[k] = La->elem[i]; i++;    k++;
    }

while (j < Lb->length) {
      Lc->elem[k] = Lb->elem[j]; j++;    k++;
    }
}

void
outputlist(List *L)
{
    int i;
    for(i = 0;i < L->length; i++) {
    printf("第%d个元素%d\n", i + 1, L->elem[i]);
     }
}

int main(int argc, char const *argv[]) {
#ifndef _OJ_  //ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif

int n;
    List L;
    List La;
    List Lb, Lc;
    scanf("%d", &n);
    init_List(L);
    inputlist(L,n);
    outputlist(L);
    printf("长度为length == %d\n", list_length(L));

List_delete(L,1);
    outputlist(L);
    printf("长度为length == %d\n", list_length(L));

List_insert(L,1,4);
    outputlist(L);
    printf("长度为length == %d\n", list_length(L));*/

init_List(&La);
    inputlist(&La,n);
    outputlist(&La);
    init_List(&Lb);inputlist(&Lb,n);outputlist(&Lb);
    init_List(&Lc);
    printf("长度为length == %d\n", list_length(&La));
    printf("长度为length == %d\n", list_length(&Lb));
    List_union(&La,&Lb,&Lc);
    outputlist(&Lc);
     List_union(La,Lb,Lc);
     printf("长度为length == %d\n", list_length(Lc));
     outputlist(Lc);

return 0;
}

但是在实现合并两个表的时候,发现用List *la,*lb,*lc;

init_list(La) init_list(Lb)

不可以申请两个表,就算是申请最后两个表就变成一样的了。。。。

时间: 2024-10-12 07:18:31

链表的顺序实现的相关文章

线性链表之顺序表

顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 特点:顺序存取,随机访问. /* Name: SeqList Copyright: 1.0 Author: Johnny Zen Date: 04/06/17 21:51 Description: 线性链表之顺序表 *//* Chinese:顺序(线性)表 English:SeqList*/#in

有序链表和顺序表

通过捕捉键盘动作来进行交互,头文件为conio.h,是console input output的缩写,捕捉用户键盘按键的函数为getch(),通过键值码可以找到对应的按键. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #define MAX 5000 struct List { int num; List

单链表与顺序表的对比

时间复杂度的对比: 操作 链表 顺序表 访问元素 O(n) O(1) 从头部删除元素 O(1) O(n) 从尾部删除元素 O(n) O(1) 在中间插入元素 O(n) O(n) 总结: 链表失去了顺序表随机读取的优点,同时链表由于增加了节点的指针域,空间开销比较大,但对存储空间使用要相对灵活 链表和顺序表在插入和删除是进行的是完全不同的操作 链表: 1.主要耗时的操作是遍历查找 2.删除和插入操作本身的复杂度是O(1) 顺序表: 1.主要耗时的操作是拷贝覆盖 2.抛除元素在尾部的情况 顺序表进行

链表和顺序表的一些区别

顺序表与链表是非常基本的数据结构,它们可以被统称为线性表. 线性表(Linear List)是由 n(n≥0)个数据元素(结点)a[0],a[1],a[2]-,a[n-1] 组成的有限序列. 顺序表和链表,是线性表的不同存储结构.它们各自有不同的特点和适用范围.针对它们各自的缺点,也有很多改进的措施. 一.顺序表 顺序表一般表现为数组,使用一组地址连续的存储单元依次存储数据元素,如图 1 所示.它具有如下特点: 长度固定,必须在分配内存之前确定数组的长度. 存储空间连续,即允许元素的随机访问.

线性表的两种形式的定义与相关操作(单链表和顺序表)

#include <stdio.h> #include <string.h> #include <malloc.h> #pragma warning(disable:4996) #define ERROR 0 #define OK 1 #define MAXSIZE 100 typedef int ElemType; typedef int Status; typedef struct LNode; typedef struct { ElemType *elem; in

颠倒一个链表的顺序 C++

首先我们定义一个头结点: struct Node{ int data; Node*next; }; 接下来我们写一个函数来创建一个链表: //a是一个数组,n代表数组元素的个数 Node*createLinkList(int a[],int n) { if(a==NULL||n==0) return NULL; Node*L,*T=NULL; for(int i=0;i<n;i++) { if(i==0) {L=new Node; L->data=a[i]; L->next=NULL;

将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变。

2.将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变. 示例: 交换前链表的顺序             交换后链表的顺序 4→5→3→1→2   ==>  5→3→1→4→2 1 ==> 1                   (链表仅含一个元素) 2→1 ==>1→2 ==>         (链表为空) C/C++: 链表节点定义为: struct node { struct node *next; int value; };

C# 数据结构 线性表(顺序表 链表 IList 数组)

线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. (2)线性表中的元素是有限的(List),线性表中的数据类型一致. (3)线性表表示方法 L={a1,a2,a3,a4…….an},L=(D,R) (4)每一个元素都有前驱和后继,第一个元素只有后继,最后一个元素只有前驱. 实例 例如:1-100的整数是一个线性表 {“zhangsan”, “lis

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下