03 线性表的存储和其它操作

实验目的:

掌握线性表的顺序存储结构和链式存储结构设计与其它操作的实现

实验内容:

1、采用线性表动态分配顺序存储结构,编程实现顺序表中数据元素的逆置操作。

2、有一个带头结点的线性链表 L,编程实现链表中数据元素的逆置操作。要求不另设新结点。

3、采用线性表动态分配顺序存储结构,编程实现顺序表中数据元素按值非递减排列。

4、有一个带头结点的线性链表 L,编程实现链表中数据元素按值非递减排列。要求不另设新结点。

程序清单:

1.

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

#define TRUE 1

#define FALSE 0

#define OK 0

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

typedef int ElemType;

typedef struct LNode

{

    ElemType data;

    struct LNode* next;

}LNode, * linklist;

//从表尾到表头逆向创建n个元素的单链表

void createlistl(linklist& l, int n)

{

    int i;

    linklist p;

    l = (linklist)malloc(sizeof(LNode));

    l->next = NULL;

    for (i = n; i > 0; --i)

    {

         p = (linklist)malloc(sizeof(LNode));

         scanf("%d" ,& p->data);

         p->next = l->next; l->next = p;

    }

}

//输出单链表

Status outputlistl(linklist l)

{

    linklist p = l->next;

    if (!p) return ERROR;

    while (p!=NULL )

    {

         printf(" %d", p->data);

         p = p->next;

    }

    printf("\n");

    return OK;

}

Status geteleml(linklist& l, int i, ElemType& e)

{

    linklist p;

    int j;

    p = l->next; j = 1;

    while (p && j < i)

    {

         p = p->next; ++j;

    }

    if (!p || j > i) return ERROR;

    e = p->data;

    return OK;

}

Status listinsertl(linklist& l, int i, ElemType e)

{

    int j;

    linklist p, s;

    p = l; j = 0;

    while (p && j < i - 1)

    {

         p = p->next;

         ++j;

    }

    if (!p || j > i - 1) return ERROR;

    s = (linklist)malloc(sizeof(LNode));

    s->data = e; s->next = p->next; p->next = s;

    return OK;

}

Status listdeletel(linklist& l, int i, ElemType& e)

{

    int j;

    linklist p,q;

    p = l; j = 0;

    while (p->next && j < i - 1)

    {

         p = p->next;

         ++j;

    }

    if (!(p->next) || j > i - 1) return ERROR;

    q = p->next; p->next = q->next; e = q->data;

    free(q);

    return OK;

}

int main()

{

    ElemType b, d, dd;

    linklist l;

    printf("创建单链表,输入5个元素:\n");

    createlistl(l, 5);

    printf("输出单链表所有元素!\n");

    outputlistl(l);

    printf("输出单链表第2个位置元素到dd!\n");

    geteleml(l, 2, dd);

    printf("dd=%d\n", dd);

    printf("插入元素b:");

    scanf("%d", &b);

    printf("在单链表第4个位置插入%d!\n", b);

    listinsertl(l, 4, b);

    printf("输出插入操作后单链表所有元素!\n");

    outputlistl(l);

    printf("删除单链表第3个位置的元素!\n");

    listdeletel(l, 3, d);

    printf("输出删除操作后单链表所有元素!\n");

    outputlistl(l);

}

2.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <time.h >

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

typedef int ElemType;

typedef struct LNode

{

    ElemType data;

    struct LNode* next;

} LNode, * LinkList;

//Create the linked list L with n elements from head to rear

void CreateList_L(LinkList& L, int n)

{

    LinkList p, q;

    int i;

    L = (LinkList)malloc(sizeof(LNode));

    q = L;

    srand(time(0));

    for (i = 1; i <= n; i++) {

         p = (LinkList)malloc(sizeof(LNode));

         p->data = rand() % 90 + 10;

         q->next = p;

         q = q->next;

    }

    q->next = NULL;

} // CreateList_L

//Output the linked list

Status OutputList_L(LinkList L)

{

    LinkList p = L->next;

    if (p == NULL)

         return ERROR;

    while (p != NULL)

    {

         printf("%d ", p->data);

         p = p->next;

    }

    printf(" \n");

    return OK;

}

//Data elements of the linked list are converse

Status ListConverse_L(LinkList& L) {

    LinkList p, q;

    p = L->next;

    L->next = NULL;

    while (p != NULL)

    {

         q = p;

         p = p->next;

         q->next = L->next;

         L->next = q;

    }

    return OK;

} // ListConverse_L

int main()

{

    LinkList L;

    printf("Create the linked list,");

    CreateList_L(L, 5);

    printf("Output all elements of the linked list!\n");

    OutputList_L(L);

    ListConverse_L(L);

    printf("Output all converse elements of the linked list!\n");

    OutputList_L(L);

    return 0;

}

3.

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

#define ADD 10

typedef struct {

    int* elem;

    int length;

    int listsize;

}List;

int CreatList(List& L, int  n) {

    L.elem = (int*)malloc(n * sizeof(int));

    L.length = n;

    L.listsize = n;

    int i;

    for (i = 0; i < n; i++)

         scanf("%d", &L.elem[i]);

    return 0;

}

void sortList(List& L) {

    int* p;

    int* q;

    int* end;

    int i = 0;

    int temp;

    end = L.elem + L.length - 1;

    for (i = 0; i < L.length; i++)

    {

         p = &(L.elem[i]);

         for (q = &(L.elem[i]); q <= end; q++)

             if (*q < *p)

             {

                  temp = *q;

                  *q = *p;

                  *p = temp;

             }

    }

}

void printfList(List& L) {

    int i = 0;

    for (i = 0; i < L.length; i++)

         printf("%d ", L.elem[i]);

    return;

}

int main() {

    List L;

    printf("请输入10个线性表中的元素:");

    CreatList(L, 10);

    sortList(L);

    printf("\n输出排序后的顺序表:");

    printfList(L);

    return 0;

}

4.

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

typedef struct LNode {

    int data;

    struct LNode* next;

}LNode, * List;

void CreatList(List& L, int n) {

    List p;

    List q;

    int i;

    L = (List)malloc(sizeof(LNode));

    L->next = NULL;

    p = L;

    for (i = 0; i < n; i++)

    {

         q = (List)malloc(sizeof(LNode));

         scanf("%d", &q->data);

         p->next = q;

         p = p->next;

    }

    p->next = NULL;

}

void sortList(List& L, int n) {

    List p;

    List q;

    int i, j, k;

    int temp;

    q = p = L->next;

    for (i = 0; i < n; i++)

    {

         q = p;

         for (j = i; j < n; j++)

         {

             if (q->data < p->data)

             {

                  temp = q->data;

                  q->data = p->data;

                  p->data = temp;

             }

             q = q->next;

         }

         p = p->next;

    }

}

void printfList(List& L) {

    List p;

    p = L;

    while (p->next) {

         p = p->next;

         printf("%d ", p->data);

    }

}

int main() {

    List L;

    printf("请输入10个链表元素:");

    CreatList(L, 10);

    printf("\n输出排序后的链表:");

    sortList(L, 10);

    printfList(L);

    return 0;

}

运行情况:

1.

2.

3.

4.

实验体会:

这次的程序设计,让我对标准内存分配函数:malloccallocrealloc有了更深刻的认识, 他们的作用都是动态分配内存。但与此同时,他们也有一些区别:

malloccalloc的区别为1块与n块的区别:

malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。

calloc调用形式为(类型*)calloc(nsize):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。

realloc调用形式为(类型*)realloc(ptrsize):将ptr内存大小增大到size

除此之外,运用完内存后还要进行释放,这就需要用到free函数。

free的调用形式为free(voidptr):释放ptr所指向的一块内存空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值