您的位置:首页 > 其它

线性表

2015-09-22 09:48 211 查看
线性表的顺序存储及部分操作:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

#define LIST_INIT_SIZE 100
#define LISTINCREMENT  10

typedef struct {
    int *elem;
    int length;
    int listsize;
}SqList;

int InitList_Sq(SqList &L,int n){
    L.elem=(int *)malloc(n*sizeof(int));
    if(!L.elem)exit(-2);
    L.length=0;
    L.listsize=n;
    return 1;
}

int Listinsert_Sq(SqList &L,int i,int e){
    if(i<1||i>L.length+1)return 0;
    if(L.length>=L.listsize){
        int *newbase;
        newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)exit(-2);
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;
    }
    int *p,*q;
    q=&(L.elem[i-1]);
    for (p=&(L.elem[L.length-1]);p>=q;--p)
        *(p+1)=*p;
    *q=e;
    ++L.length;
    return 1;
}

int ListDelete_Sq(SqList &L,int i,int &e){
    if(i<1||(i>L.length+1))return 0;
    int *p,*q;
    p=&(L.elem[i-1]);
    e=*p;
    q=L.elem+L.length-1;
    for(++p;p<=q;++p)*(p-1)=*p;
    --L.length;
    return 1;
}
int LocateElem_Sq(SqList L, int e){//find the first location of element e
    int i=1;
    int *p=L.elem;
    while(i<=L.length&&!(*p++==e))++i;
    if(i<=L.length)return i;
    else return 0;
}
void MegeList_Sq(SqList La,SqList Lb,SqList &Lc){
    int *pa=La.elem,*pa_last,*pb=Lb.elem,*pb_last,*pc;
    Lc.listsize=La.length+Lb.length;
    pc=Lc.elem=(int *)malloc(Lc.listsize*sizeof(int));//haven't delete  repeated element
    if(!Lc.elem)exit(-2);
    pa_last=La.elem+La.length-1;
    pb_last=Lb.elem+Lb.length-1;
    while(pa<=pa_last&&pb<=pb_last){
        if(*pa<=*pb)*pc++=*pa++;
        else *pc++=*pb++;
    }
    while(pa<=pa_last)*pc++=*pa++;
    while(pb<=pb_last)*pc++=*pb++;
}

void Display(SqList A){
    for(int i=0;i<A.length;i++)
        printf("%d ",*(A.elem+i));
    puts("");
}
int main(){
    SqList TableA;
    int n;//This array have n elements,and m elements need to insert to the array
    scanf("%d",&n);
    InitList_Sq(TableA,n);
    for(int i=0;i<n;i++){
        scanf("%d",TableA.elem+i);
        TableA.length++;
    }
    Display(TableA);

    int e,loc,tmp=0;
    scanf("%d%d",&loc,&e);
    if(!Listinsert_Sq(TableA,loc,e))printf("Error\n");
    Display(TableA);

    printf("%d\n",LocateElem_Sq(TableA,e));

    if(!ListDelete_Sq(TableA,loc,tmp))printf("Error\n");
    else Display(TableA);

    return 0;
}

线性表链式表示:

//有几点还没解决,插入数据的类型,和创建时类型有点区别,输出时数据有点怪异,有空改正

主要问题出自在定义LNode的时候,手误将data(int)定义为了*int
<p>// MyList.cpp : 定义控制台应用程序的入口点。
//</p><p>#include "stdafx.h"</p><p>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;</p><p>#define LIST_INIT_SIZE 100
#define LISTINCREMENT  10</p><p>typedef struct LNode{
    int data;
    struct LNode *next;
}*LinkList;</p><p>void CrateList_L(LinkList &L,int n){
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    LinkList p;
    for(int i=n;i>0;--i){
        p=(LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next=L->next;L->next=p;
    }
}</p><p>int GetElem_L(LinkList L,int i,int &e){
    LinkList p=L->next;
    int j=1;
    while(p&&j<i){
        p=p->next;++j;
    }
    if(!p||j>i)return 0;
    e=p->data;
    return 1;
}</p><p>int ListInsert_L(LinkList &L,int i,int &e){//insert one element to i's  position
    LinkList p=L,s;
    int j=1;
    while(p&&(j<i)){p=p->next;++j;}
    if(!p||j>i)return 0;
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return 1;
}</p><p>int ListDelete_L(LinkList &L,int i,int e){
    LinkList p=L;int j=0;
    while(p->next&&j<i-1){
        p=p->next;++j;
    }
    if(!(p->next)||j>i-1)return 0;
    LinkList q=p->next;p->next=q->next;
    e=q->data;free(q);
    return 1;
}</p><p>void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){
    LinkList pa=La->next,pb=Lb->next,pc=La;
    Lc=pc;
    while(pa&&pb){
        if(pa->data<=pb->data){
            pc->data=pa->data;pc=pa;pa=pa->next;
        }
        else {pc->next=pb;pc=pb;pb=pb->next;}
    }
    pc->next=pa?pa:pb;
    free(Lb);
}</p><p>void DisplayT(LinkList A){
    A=A->next;
    while(A!=NULL){
        printf("%d ",A->data);
        A=A->next;
    }
    puts("");
}
int main(){
    LinkList LinkT;
    int n;
    scanf("%d",&n);
    CrateList_L(LinkT,n);
    DisplayT(LinkT);
    int loc,e,tmp=0;
    scanf("%d%d",&loc,&e);
    ListInsert_L(LinkT,loc,e);
    DisplayT(LinkT);
    GetElem_L(LinkT,loc,tmp);
    printf("%d\n",tmp);
    tmp=0;
    ListDelete_L(LinkT,loc,tmp);
 DisplayT(LinkT);
    return 0;
}
</p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: