回 帖 发 新 帖 刷新版面

主题:顺序表的一系列实验

顺序存储的插入和删除
  菜单:  1.初始化  2.插入  3.删除  4.退出
要求在同一个程序中实现
望各位热心朋友多多帮忙,这个问题已经难了很多朋友了!
不胜感激!

回复列表 (共6个回复)

沙发

#include "stdlib.h"
#include "stdio.h"

#define TRUE 1
#define ERROR 0
#define list_max 1000
#define add_max 100

struct list
{
    int * elem;
    int length;
    int listsize;
};
//初始化线性表
void initlist(list & l)
{
    l.listsize=list_max;
    l.elem=(int *)malloc(sizeof(int)*(l.listsize));
    if(!l.elem) exit(1);
    l.length=0;
}
//销毁线性表
void destroylist(list & l)
{
    if(&l)
        free(&l);
    else
        exit(1);
}
//清空线性表元素
void clearlist(list & l)
{
    if(&l)
    {
        free(l.elem);
        l.length=0;
    }
    else
        exit(1);
}
//判断线性表是否为空
bool listempty(list  l)
{
    if(&l)
    {
        if(l.length==0)
            return(TRUE);
        else 
            return(ERROR);
    }
    else 
        exit(1);
}

//返回线性表的长度
int listlength(list l)
{
    if(&l)
        return(l.length);
    else
        exit(1);
}
//返回线性表的第i个元素
void getelem(list l,int i,int & e)
{
    if(&l&&i<=l.length)
    {
        e=l.elem[i-1];
    }
    else
        exit(1);
}


int compare(int i,int j)
{
    if(i>j)
        return(1);
    else if(i==j) 
        return(0);
    else 
        return(-1);
}
    

int LocateElem(list l,int e,int cmp)
{
    if(&l)
    {
        for(int i=0;i<l.length;i++)
        {
            if(compare(l.elem[i],e)==cmp)
                return(i+1);
        }
        return(0);
    }
    else
        exit(1);
}

bool PriorElem(list l,int cur_e,int & pre_e)
{
    if(&l)
    {
        for(int i=0;i<l.length;i++)
        {
            if(cur_e==l.elem[i]&&i!=0)
            {
                pre_e=l.elem[i-1];
                return(TRUE);
            }
        }
        pre_e=NULL;
        return(ERROR);
    }
    else
        exit(1);
}


bool NextElem(list l,int cur_e,int & next_e)
{
    if(&l)
    {
        for(int i=0;i<(l.length-1);i++)//只要循环到倒数第二个元素,因为要求cur_e不为最后一个元素
        {
            if(cur_e==l.elem[i])
            {
                next_e=l.elem[i+1];
                return(TRUE);
            }
        }
        next_e=NULL;
        return(ERROR);
    }
    else
        exit(1);
}


//在线性表的第i个元素前插入一个元素
void ListInsert(list & l,int i,int e)
{
    if(&l&&i<=l.length)
    {
        if(l.length>=l.listsize)
        {    
            free(l.elem);
            l.elem=(int *)malloc(sizeof(int)*(l.listsize+add_max));
        }
        l.length++;
        for(int j=0;j<l.length-i;j++)//要移位的数为原来lenth-(i-1)=现在length-i
        {
            l.elem[l.length-1-j]=l.elem[l.length-2-j];//移位
        }
        l.elem[i-1]=e;
    }
    else
        exit(1);
}


//删除线性表的第i个元素
void listdelete(list & l,int i,int e)
{
    if(&l&&i<=l.length&&i>=1)
    {
        l.length--;
        for(int j=0;j<l.length-i+1;j++)//要移位的数为原来lenth-i=现在length-i+1
        {    
            l.elem[i-1+j]=l.elem[i+j];//移位
        }
        e=l.elem[i-1];
    }
    else
        exit(1);
}


    
        




    



板凳

这是我自己写的线性表的抽象数据结构,是按照严<<数据结构>>

3 楼

再给你两道题的解(A并B)
#include "ADT.h"
#include "stdlib.h"
void mergeAB(list & a,list & b)
{
    int i,j;
    if((&a)&&(&b))
    {
        for(i=0;i<b.length;i++)
        {
            for(j=0;j<a.length;j++)
            {
                if(b.elem[i]==a.elem[j])
                    break;
            }
            if(j==a.length)
                ListInsert(a,1,b.elem[i]);
        }
    }
    else
        exit(1);
}


void main()
{
    list a,b;
    initlist(a);
    initlist(b);
    a.length=10;
    b.length=20;
    for(int i=0;i<10;i++)
        a.elem[i]=i;
    for(int j=0;j<20;j++)
        b.elem[j]=j;
    mergeAB(a,b);
    for(int m=0;m<a.length;m++)
        printf("%d ",a.elem[m]);
}

4 楼

#include "ADT.h"
#include "stdio.h"

void merge(list a,list b,list & c)
{
    int i=0,j=0,flag=0;
    c.length=(a.length)+(b.length);
    while(i<a.length&&j<b.length)
    {
        if(a.elem[i]>b.elem[j])
            c.elem[flag++]=b.elem[j++];
        else
            c.elem[flag++]=a.elem[i++];
    }
    while(j<b.length)
        c.elem[flag++]=b.elem[j++];
    while(i<a.length)
        c.elem[flag++]=a.elem[i++];
}

void main()
{
    list a,b,c;
    initlist(a);
    initlist(b);
    initlist(c);
    a.length=10;
    b.length=20;
    for(int i=0;i<a.length;i++)
        a.elem[i]=i;
    for(int j=0;j<b.length;j++)
        b.elem[j]=j;
    merge(a,b,c);
    for(int m=0;m<c.length;m++)
        printf("%d ",c.elem[m]);
}



合并A.B到C    
    

5 楼


谢谢你的解答!
不过调试的时间好像要多于编的时间!

6 楼

以上程序用的是什么编译器。

我来回复

您尚未登录,请登录后再回复。点此登录或注册