yznu:数据结构与算法:线性表操作练习

实验目的及要求:

1. 理解线性表的概念及特征、线性表顺序存储结构的含义及优势和缺点、线性表链式存储结构的含义及优势和缺点;

2. 理解线性表顺序存储方案(元素和关系如何存储)、线性表链式存储方案之一单链表存储方案(元素和关系的存储);

3. 理解线性表顺序存储结构的C语言定义、单链表存储结构的C语言定义;

4. 熟练掌握顺序表变量定义、顺序表初始化、建立、查找、定位、插入、删除合并等操作;单链表变量定义、单链表初始化、建立、查找、定位、插入、删除合并等操作。

5. 理解线性表链式存储其他存储方案,如:循环链表、双向链表的概念和C语言结构体定义。掌握在其上的常见操作。

6. 掌握单链表应用之一,一元一次多项式表示及相加问题。

实验内容:

任务一:顺序表操作练习

1. 编写算法:先输入线性表长度n,然后输入n个整数建立整数顺序表。在顺序表上练习①按值查找;②删除元素  的操作。

2. 编写算法:输入数个字符建立字符顺序表,在顺序表上练习①求表长度;②按序号查找;③插入元素 的操作。

任务二:线性链表练习

1. 编写算法 :先输入线性表长度n,然后输入n个整数利用头插法建立整数单链表。在单链表上练习①打印输出该单链表;②按序号查找;③删除元素。

2. 编写算法:输入数个字符利用尾插法建立字符单链表。在单链表上练习①打印输出该单链表;②输出单链表长度;③按值查找;④插入元素。

3. 【选做】编写算法:建立任意一元多项式的存储结构(采用单链表),并实现两个一元多项式相加操作。

程序代码:

任务一(1)

#include<stdio.h>

#include<stdlib.h>

#define OK 1

#define ERROR 0

typedef int Status;

typedef int ElemType;

typedef struct

{

    ElemType *elem;

    int length;

}SqList;Status InitList(SqList* L,int max){

    L -> elem = (ElemType *)malloc(max*sizeof(ElemType));

    if(!L -> elem){

        return ERROR;

    }

    L -> length = 0;

    return OK;

}

Status ListDelete(SqList *L, int i, ElemType *e){

    int k;

    if(L->length == 0){

        return ERROR;

    }

    if(i < 1 || i > L->length){

        return ERROR;

    }

    *e = L -> elem[i-1];

    if(i < L->length){

        for(k = i;k < L->length;k++){

            L->elem[k-1] = L->elem[k];

        }

    }

    L->length--;

    return OK;

}

int LocationElem(SqList L,int e){

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

        if(L.elem[i]==e)

            return i+1;

    return 0;

}

void OutPut(SqList L){

    printf("当前顺序表的长度:%d\n", L.length);

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

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

    }

    printf("\n");

}

Status ListInsert(SqList *L, int i, ElemType e,int max){

    int k;

    if (L->length == max){ 

        return ERROR;

    }  

    if (i < 1 || i > L->length+1){

        return ERROR;

    }

    if (i <= L->length){

        for(k = L->length-1;k >= i-1;k--){

            L->elem[k+1] = L->elem[k];

        }

    }  

    L->elem[i-1] = e;

    L->length++;

    return OK;

}

int main()

{

    int max;

    SqList L;printf("输入一个线性表L的长度\n");

    scanf("%d",&max);

    InitList(&L,max);

    OutPut(L);

    printf("测试插入10个数\n");

    for(int i = 1;i <= 10; i++){

        ListInsert(&L,i,i,max);

    }

    OutPut(L);

    printf("删除第6位的数据\n");

    ElemType e;

    ListDelete(&L,6,&e);

    printf("删除的数据为:%d\n", e);

    OutPut(L);

    printf("获取元素操作\n");

    int num;

    num=LocationElem(L,7);

    printf("在第%d个元素", num);

}

(2)

#include<stdio.h>

#include<stdlib.h>

#define max 20

#define OK 1

#define ERROR 0

typedef char Status;

typedef char ElemType;

typedef struct

{

    ElemType *elem;

    int length;

}SqList;

Status InitList(SqList* L){

    L -> elem = (ElemType *)malloc(max*sizeof(ElemType));

    if(!L -> elem){

        return ERROR;

    }

    L -> length = 0;

    return OK;

}

void OutPut(SqList L){

    printf("当前顺序表的长度:%d\n", L.length);

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

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

    }

    printf("\n");

}

Status ListInsert(SqList *L, int i, ElemType e){

    int k;

    if (L->length == max){ 

        return ERROR;

    }  

    if (i < 1 || i > L->length+1){

        return ERROR;

    }

    if (i <= L->length){

        for(k = L->length-1;k >= i-1;k--){

            L->elem[k+1] = L->elem[k];

        }

    }  

    L->elem[i-1] = e;

    L->length++;

    return OK;

}

Status GetElem(SqList L, int i, ElemType *e){

    if(L.length == 0 || i<1 || i>L.length){

        return ERROR;

    }

    *e = L.elem[i-1];

    return OK;

}

int main()

{

    SqList L;

    InitList(&L);

    OutPut(L);

    printf("测试插入10个数\n");

    for(char i = 1;i <= 10; i++){

        ListInsert(&L,i,i+'0');

    }

    printf("输出线性表L的长度\n");

    OutPut(L);

    printf("按序号查找\n");

    ElemType e;

    GetElem(L,5,&e);

    printf("得到第5个元素:%c", e);

}

任务二(1)

#include<stdio.h>

#include<stdlib.h>

typedef int elemtype;

typedef struct Node                   

{

    elemtype data;

    struct Node *next;

}Node;

typedef struct Node *LinkList;

int InitList(LinkList *L)

{

    (*L) = (LinkList)malloc(sizeof(Node));

    (*L)->next = NULL;

    return 0;

}

void CreateListHead(LinkList *L)

{

    int i, n;

    LinkList p;

    (*L) = (LinkList)malloc(sizeof(Node));        

    (*L)->next = NULL;

    printf("请输入您要插入元素的个数:");

    scanf("%d", &n);

    printf("请输入你要插入的元素值(用空格隔开):");

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

    {

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

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

        p->next = (*L)->next;                         

        (*L)->next = p;                                   

    }

}

int GetElem(LinkList L, int i, elemtype *e)        

{

    int j = 1;

    LinkList p;

    p = L->next;                          

    while (p && j < i)

    {

        p = p->next;

        ++j;

    }

    if (!p || j > i)

    {

        printf("查询不到该元素!\n");

        return 0;

    }

    *e = p->data;                         

    return 0;

}

int DeleteList(LinkList *L, int i, elemtype *e)            

{

    LinkList p, q;

    int j = 1;

    p = *L;

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

    {

        p = p->next;

        ++j;

    }

    if (!(p->next) || j > i)

    {

        printf("删除元素失败!\n");

        return 0;

    }

    q = p->next;

    p->next = q->next;

    *e = q->data;

    free(q);

    return 0;

}

void ShowList(LinkList *L)                

{

    LinkList p;

    p = (*L)->next;

    if (p == NULL)

    {

        printf("这是一个空链表!\n");

    }

    printf("单链表");

    while (p)

    {

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

        p = p->next;

    }

    printf("\n");

}

int main()

{

    LinkList L;

    InitList(&L);

    int k,i;

    elemtype m ;

    CreateListHead(&L);

    ShowList(&L);

    int text;

    printf("请输入查询的序号\n");

    scanf("%d",&text);

    GetElem(L, text, &m);

    printf("得到的元素值为:%d\n", m);

    int text2;

    printf("请输入想删除元素的序号\n");

    scanf("%d",&text2);

    DeleteList(&L, text2, &m);

    printf("删除元素后的");

    ShowList(&L);

    printf("删除的元素值为:%d\n", m);

    system("pause");

    return 0;

}

(2)

#include<stdio.h>

#include<stdlib.h>

typedef char elemtype;

typedef struct Node                   

{

    elemtype data;

    struct Node *next;

}Node;

typedef struct Node *LinkList;

int InitList(LinkList *L)//链表初始化

{

    (*L) = (LinkList)malloc(sizeof(Node));

    (*L)->next = NULL;

    return 0;

}

void CreateListTail(LinkList *L)            {

    int i, n;

    LinkList p,r;                         

    (*L) = (LinkList)malloc(sizeof(Node));

    r = *L;

    printf("请输入您要的元素的个数:");

    scanf("%d", &n);

    printf("请输入你要插入的元素值(用空格隔开):");

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

    {

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

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

        r->next = p;                                  

        r = p;

    }

    r->next = NULL;                                   

}

int GetElem(LinkList L, char ch, elemtype *e)          

{

    int j = 1;

    LinkList p;

    p = L->next;

    while(p){

        if(ch == p->data){

    return j;

        }

        p = p->next;

        ++j;

    }

    return 0;

}

void ShowList(LinkList *L)                

{

    LinkList p;

    p = (*L)->next;

    if (p == NULL)

    {

        printf("这是一个空链表!\n");

    }

    printf("单链表");

    while (p)

    {

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

        p = p->next;

    }

    printf("\n");

}

int InsertList(LinkList *L, int i, elemtype e)         

{

    LinkList p, s;

    int j = 1;

    p = *L;

    while (p && j < i)

    {

        p = p->next;

        ++j;

    }

    if (!p || j > i)

    {

        printf("插入元素失败!\n");

        return 0;

    }

    s = (LinkList)malloc(sizeof(Node));

    s->data = e;

    s->next = p->next;                        

    p->next = s;   

    return 0;

}

int LengthList(LinkList *L)               

{

    int length = 0;                       

    LinkList p;

    p = (*L)->next;               

    while (p)                         

    {

        length++;                     

        p = p->next;

    }

    return length;

}

int main()

{

    LinkList L;

    InitList(&L);

    int k,i;

    elemtype m ;

    CreateListTail(&L);

    ShowList(&L);

    printf("单链表的长度为%d\n", LengthList(&L));

    char text1;

    getchar();

    scanf("%c",&text1);

    printf("得到的元素位置为:%d \n", GetElem(L, text1, &m));

    int text2;

    printf("请输入想插入的位置");

    scanf("%d",&text2);

    getchar();

    printf("请输入插入的元素");

    elemtype text3;

    scanf("%c",&text3);

    InsertList(&L,text2,text3 );

    printf("插入元素后的");

    ShowList(&L);

    system("pause");

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值