当前位置:   article > 正文

实验一 顺序表和链表的实现和应用

实验一 顺序表和链表的实现和应用

【实验内容】

  1. 采用递增有序的顺序表表示集合,求解两个集合的交集、并集和差集
    (1)定义顺序表的存储结构;
    (2)实现存储递增有序集合的顺序表的建立、求交集、并集和差集等运算;
    (3)要求算法的时间性能在线性时间复杂度内;
    (4)和采用无序顺序表所表示的集合的有关运算的时间性能进行比较。
  2. 采用递增有序的链表表示集合,求解两个集合的交集、并集和差集
    (1)定义链表的存储结构;
    (2)实现存储递增有序集合的链表的建立、求交集、并集和差集等运算;
    (3)要求算法的时间性能在线性时间复杂度内;
    (4)和采用无序链表所表示的集合的有关运算的时间性能进行比较。
    3.比较顺序表和链表的优缺点和适用场合

实验要求:
1.分别建立包含10个数据元素的顺序线性表和链式线性表;
2.从键盘输入一个数据元素和插入位置k,将元素插入到线性表中第k(包含0号位置)个位置;
3.从键盘输入一个数据元素关键字或位置k(包含1号位置),从线性表中删除相应数据元素;
4.能完成查找功能;
5.给出程序及插入、删除前和插入、删除后线性表结果。

顺序表求交集算法

void Intersection(SqList A,SqList B,SqList &C)
{
    printf("求线性表的交集\n");
    int i,j,k=0;
    for(i=0;i<A.length;i++)
    {
        j=0;
        while(j<B.length && B.elem[j]!=A.elem[i])
            j++;
        if(j<B.length)
        {
            C.elem[k++]=A.elem[i];
        }
    }
    C.length=k;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

链表求交集算法

LinkList AandB(LinkList A, LinkList B)
{
	LinkList pa, pb, pre;
	pa = A->next;
	pb = B->next;
	pre = A;
	while (pa && pb)
	{
		if (pa->data<pb->data)
		{
			q = pa;
			pa = pa->next;
			pre->next = pa;
			free = (q);
		}
		else if (pa->data>pb->data)
			pb = pb->next;
		else
		{
			pre = pa;
			pa = pa->next;
			pb = pb->next;
		}
	}
	while (pa)
	{
		q = pa;
		pa = pa->next;
		free(q);
	}
	pre->next = NULL;
	return(A);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

1:顺序表实现

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define TURE 1
#define FAUSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 4
typedef int Status;
typedef int ElemType;
typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
}SqList;

Status InitList_Sq(SqList *L) //初始化线性表
{
    L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L->elem)return OVERFLOW;
    L->length=0;
    L->listsize =LIST_INIT_SIZE;
    return OK;
}

Status ListInsert_Sq(SqList *L,int i,ElemType e)//向表中插入元素
{
    ElemType *q,*p,*newbase;
    if(i<1||i>L->length+1)
        return ERROR;
    if(L->length>=L->listsize)//若当前表长>=计划表长则开辟新空间
    {
        newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)return ERROR;
        L->elem=newbase;
        L->listsize+=LISTINCREMENT;

    }

    q=&(L->elem[i-1]);
    for(p=&(L->elem[L->length-1]);p>=q;p--)*(p+1)=*p;
       *q=e;
       ++L->length;

       return OK;
}

 Status ListDelete_Sq(SqList *L,int i,ElemType *e)//删除表中的元素
 {
     ElemType *p,*q;
     if(i<1||i>L->length+1)return ERROR;
     p=&(L->elem[i-1]);
     *e=*p;
     q=(L->elem+L->length-1);
     for(++p;p<=q;p++)*(p-1)=*p;
     --L->length;
    return OK;
 }
int ListFind(SqList L,int k)
 {
     return L.elem[k-1];
 }
int main()
{
    SqList Lst;
    int i,j,n=10,a,k,p=1;
    ElemType e;
    if(InitList_Sq(&Lst)==OK)
    {
        for(i=1;i<=n;i++)
            if(ListInsert_Sq(&Lst,i,i)!=OK)break;
            printf("原来线性表中的元素为:");
            for(i=0;i<Lst.length;i++)
                printf("%d ",Lst.elem[i]);
                printf("\n");
            while(p)
            {
                printf("1)插入元素2)删除元素3)查找元素4)显示操作结果0)退出\n");
                scanf("%d",&j);
                switch(j)
                {
                    case 1:
                printf("请输入要插入的元素和插入的位置:");
                scanf("%d%d",&a,&k);
                ListInsert_Sq(&Lst,k,a);break;
                    case 2:
                    printf("请输入要删除的位置:");
                scanf("%d",&k);
                ListDelete_Sq(&Lst,k,&e);break;
                    case 3:
                    printf("请输入查找元素的位置:");
                    scanf("%d",&k);
                    printf("位置为%d的元素为%d\n",k,ListFind(Lst,k));
                    case 4:
                for(i=0;i<Lst.length;i++)
                    printf("%d ",Lst.elem[i]);
                    printf("\n");break;
                    case 0:p=0;break;
                }
            }

    }//if
    return 0;
}//main
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

在这里插入图片描述
2:链表实现

#include<stdio.h>//带头结点的链表操作
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -1
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
void GetElem(LinkList L,int i,ElemType *e)//查找第i个元素并返回
{
    LNode *p;
    int j=1;
    p=L->next;
    while(p&&j<i)
    {
        p=p->next;++j;
    }
    if(!p||j>i)printf("不存在,查找错误\n");
    else
    *e=p->data;
}
void ListInsert_L(LinkList *L,int i,ElemType e)//插入元素
{
    LinkList p=*L,s=NULL;
    int j=0;
    while(p&&j<i-1){p=p->next;++j;}
    if(!p||j>i-1)printf("插入位置错误\n");
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
}
void ListDelet_L(LinkList *L,int i,ElemType *e)//删除元素
{
    LNode *p=*L,*q=NULL;
    int j=0;
    while(p->next&&j<i-1)
    {
        p=p->next;++j;
    }
    if(!(p->next)||j>i-1)printf("删除位置错误");
    q=p->next;p->next=q->next;
    *e=q->data;
    free(q);
}
void CreatList(LinkList *L,int n)//建立链表 输入n个ElemType类型的数
{
    LinkList p=NULL,q=NULL;
    int i;
    ElemType m;
    (*L)=(LinkList)malloc(sizeof(LNode));
    (*L)->next=NULL;
    p=(LinkList)malloc(sizeof(LNode));
    p->next=NULL;
    q=p;
    scanf("%d",&m);
    p->data=m;
    (*L)->next=p;
    for(i=1;i<n;i++)
    {
        p=(LinkList)malloc(sizeof(LNode));
        scanf("%d",&m);
        p->data=m;
        q->next=p;
        p->next=NULL;
        q=p;
    }
}
void DisList(LinkList L)
{
    LinkList p=L->next;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    LinkList L=NULL;
    int i,p=1,m;
    ElemType e;
    printf("请输入10个元素:\n");
    CreatList(&L,10);
    printf("原来的10个元素为:");
    DisList(L);
    while(p)
    {
        printf("1)插入2)删除3)查找4)显示操作结果0)退出\n");
        scanf("%d",&m);
        switch(m)
        {
        case 1:printf("请分别输入要插入元素的位置及与元素值: ");
            scanf("%d%d",&i,&e);ListInsert_L(&L,i,e);break;
        case 2:printf("请分别输入要删除元素的位置: ");
            scanf("%d",&i);ListDelet_L(&L,i,&e);printf("删除的元素值为:%d\n",e);break;
        case 3:printf("请分别输入要查找的元素的位置: ");
            scanf("%d",&i);GetElem(L,i,&e);printf("该位置的元素为:%d\n",e);break;
        case 4:DisList(L);break;
        case 0:p=0;break;
        }
    }

    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/674249
推荐阅读
相关标签
  

闽ICP备14008679号