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

【实验内容】

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

链表求交集算法

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:顺序表实现

#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

在这里插入图片描述
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;
}

在这里插入图片描述

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值