线性表的顺序表示和实现,线性表顺序


#include<stdio.h>
#include
<malloc.h>
#include
<conio.h>

#define ERROR 0
#define OK 1
#define EQUAL 1
#define OVERFLOW -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

struct STU
...{
  
char    name[20];
  
char    stuno[10];
  
int    age;
  
int    score;
}
stu[50];

typedef 
struct STU ElemType;

struct LIST
...{
  ElemType 
*elem;
  
int length;    //实际长度
  int listsize; //容量
}
;

typedef 
struct LIST List;


int init(List *L)
...{
    
//初始化,分配100个结构体长度的空间
    L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    
if(!L->elem) exit(OVERFLOW);//分配失败退出
    
    L
->length=0;//初始长度为-
    L->listsize=LIST_INIT_SIZE;//容量为100
    return OK;
}
/**//*init */

int ListLength(List *L)
...{
    
return L->length;//返回L.实际长度
}


void GetElem(List L,int i,ElemType *e)
...{
    
*e=L.elem[i];//返回L.元素i
}


int EqualList(ElemType *e1,ElemType *e2)
...{
    
if (strcmp(e1->name,e2->name)==0)//名字相等则认为是相等的
        return 1;
    
else
        
return 0;
}


int Less_EqualList(ElemType *e1,ElemType *e2)
...{
    
if (strcmp(e1->name,e2->name)<=0)//比较名字,如果小于则返回真
        return 1;
    
else
        
return 0;
}

int LocateElem(List *La,ElemType e,int type)
...{
    
int i;
    
switch (type)
    
...{
        
case EQUAL:
        
for(i=0;i<La->length;i++)
            
if(EqualList(&La->elem[i],&e))
                
return 1;
            
break;
        
default:
            
break;
    }

    
return 0;
}




void MergeList(List *La,List *Lb,List *Lc)
...{
    
/**//************************************************************************ 

    void MergeList(List *La,List *Lb,List *Lc)
    功能:合并列表                                                                     
    参数:*La 列表类型,a 列表 ->输入
    参数:*Lb 列表类型,b 列表 ->输入
    参数:*Lc 列表类型,c 列表 ->输出
    ***********************************************************************
*/

    ElemType 
*pa,*pb,*pc,*pa_last,*pb_last;    //       第1,第2,结果,第一最后,第二最后

    pa
=La->elem;//使pa 指向 列表a的第一个元素
    pb=Lb->elem;//使pb 指向 列表b的第二个元素

    Lc
->listsize = Lc->length = La->length + Lb->length;//列表c的长度和尺寸为列表b的长度+列表a的长度
    pc = Lc->elem = (ElemType *)malloc(Lc->listsize * sizeof(ElemType));//给列表c分配存储空间并使pc指向列表c的第一个元素
    
    
if(!Lc->elem)   //分配失败
        exit(OVERFLOW);

    pa_last 
= La->elem + La->length - 1;//使pa_last指向列表a的最后一个元素
    pb_last = Lb->elem + Lb->length - 1;//使pb_last指向列表b的最后一个元素
    
    
//合并算法的精华所在.
    
//    1:pa<=pa_last && pb<=pb_last(只要pb>pb_last 或 pa>pa_last 便终止循环)
    
//    2:if(Less_EqualList(pa,pb))...else... 

    
while(pa<=pa_last && pb<=pb_last) //从第1个开始循环到最后一个
    ...{
        
if(Less_EqualList(pa,pb))    
            
*pc++=*pa++;
        
else 
            
*pc++=*pb++;
    }


    
//剩余的全部加上
    
    
while(pa<=pa_last) 
        
*pc++=*pa++;
    
while(pb<=pb_last) 
        
*pc++=*pb++;
}



int UnionList(List *La,List *Lb)
...{

    
int i,j,iTmp;
    ElemType 
*a,*b;
    
int iExsit ,iResult;

    
if (Lb->length<=0return iResult;
    
    
for (i=1;i<=Lb->length;i++...{
        iExsit
=0;
        b
=Lb->elem+i-1;

        
for (j=1;j<=La->length;j++...{
            a
=La->elem+j-1;
            
            
if (strcmp(a->name,b->name)==0...{
                iExsit
=1;
                
break;
            }

        }

        
if (!iExsit) ...{
            iTmp
=La->length;
            ListInsert(La,
++iTmp ,*b);
            iResult
++;
        }

     
    }

    
return iResult;
}



int printlist(List L)
...{
    
int i;
    printf(
"name       stuno        age     score ");
    
for(i=0;i<L.length;i++)
        printf(
"%-10s %s %d %d ",  L.elem[i].name,  L.elem[i].stuno,
        L.elem[i].age,  L.elem[i].score);
    
//printf(" ");
    return 0;

}


int ListInsert(List *L,int i,struct STU e)
...{
    
struct STU *p,*q;
    
if (i<1||i>L->length+1
        
return ERROR;
    q
=&(L->elem[i-1]);
    
for(p=&L->elem[L->length-1];p>=q;--p)
        
*(p+1)=*p;
    
*q=e;
    
++L->length;
    
return OK;
}
/**//*ListInsert Before i */


main()
...{
    
struct STU e;
    List La,Lb,Lc;

    
//clrscr();

    printf(
" -------------------线性表 演示正在运行...---------------- 初始化 列表a... ");
    init(
&La);
    
    printf(
"第一个是插入演示. ");

    strcpy(e.name,
"学生1");
    strcpy(e.stuno,
"100001");
    e.age
=80;
    e.score
=1000;
    ListInsert(
&La,1,e);
    
    strcpy(e.name,
"学生3");
    strcpy(e.stuno,
"100002");
    e.age
=80;
    e.score
=1000;
    ListInsert(
&La,2,e);

    printlist(La);
    printf(
"列表a 现在的长度为:  %d. ",La.length);
    getch();

    strcpy(e.name,
"学生5");
    strcpy(e.stuno,
"100003");
    e.age
=80;
    e.score
=1000;
    ListInsert(
&La,3,e);

    printlist(La);
    printf(
"现在的长度  %d. ",La.length);
    getch();


    printf(
"初始化列表b... ");
    
    init(
&Lb);

    strcpy(e.name,
"学生2");
    strcpy(e.stuno,
"100001");
    e.age
=80;
    e.score
=1000;
    ListInsert(
&Lb,1,e);
    strcpy(e.name,
"学生4");
    strcpy(e.stuno,
"100002");
    e.age
=80;
    e.score
=1000;
    ListInsert(
&Lb,2,e);

    strcpy(e.name,
"学生6");
    strcpy(e.stuno,
"100001");
    e.age
=80;
    e.score
=1000;
    ListInsert(
&Lb,3,e);

    printlist(Lb);
    printf(
"列表b 现在的长度为:  %d. ",Lb.length);
    getch();

    printf(
"第二个演示是合并列表演示. ");
    printf(
"现在合并列表a和b... ");
    MergeList(
&La,&Lb,&Lc);
    printlist(Lc);
    getch();

    printf(
" 第三个演示是联合演示. ");
    printf(
"现在联合列表a和b..... ");
    UnionList(
&La,&Lb);
    printlist(La);
    printf(
"列表a的长度为:  %d. ",La.length);
    getch();


    printf(
" 欢迎大家一起交流 QQ群: 29940046  ");
    getch();
    

}

www.xyjys.comtrue/article/20231129/2444267.htmlTechArticle线性表的顺序表示和实现,线性表顺序 #include stdio.h #include malloc.h #include conio.h #define ERROR0 #define OK1 #define EQUAL1 #define OVERFLOW-1 #define LIST_INIT_SIZE100 #define LISTINCREMENT10 struct STU ... { char nam...

相关文章

    暂无相关文章

小鱼文聚评论

XY推荐