c语言实现的静态链表 哥们第一篇 请各位大牛多指教

#include <stdio.h>
#include <stdlib.h>


#define ElemType int
#define MAXSIZE 100


typedef struct SNode
{
ElemType elem;
int iCur;
} *Link;




ElemType InitElem( )
{
int iNum = 0;
scanf( "%d", &iNum );
return iNum;
}


void ShowElem( ElemType elem )
{
printf( "%d\n", elem );
}


int ComPare( ElemType elem1, ElemType elem2 )
{
return elem1 - elem2;
}


bool InitStaticLink( Link &link )
{
link = (Link )malloc( MAXSIZE * sizeof( SNode ) );


for( int i = 0; i < MAXSIZE - 1; ++i )
{
link[i].iCur = i + 1;
}


link[ MAXSIZE - 1 ].iCur = 0;
return true;
}


int Malloc( Link link )
{
int i = link[0].iCur;


if( i != 0 )
{
link[0].iCur = link[i].iCur;
}


return i;
}


void Free( Link link, int iPos )
{
link[iPos].iCur = link[0].iCur;
link[0].iCur = iPos;
}


void Print( Link link, int iPos )
{
if( iPos == 0 )
{
printf("Link is empty!\n");
return;
}


while( 1 )
{
ShowElem( link[iPos].elem );
if( link[iPos].iCur == 0 )
{
break;
}


iPos = link[iPos].iCur;
}
}


//功能 (A-B)U(B-A)
int Merge(Link link)
{
int iSt = Malloc( link );
if( iSt == 0 )
{
printf("No space could be alloc!");
return -1;
}

int iFirNum = 0;
int iSecNum = 0;

printf( "Input first Num:\n");
scanf( "%d", &iFirNum );
printf( "Input second Num:\n");
scanf( " %d", &iSecNum );

printf(" Now Init first link!\n");
int iMove = iSt;
int iIndex = 0;
while( iIndex++ < iFirNum )
{
int iCur = Malloc( link );
ElemType elem = InitElem();
link[iCur].elem = elem;
link[iMove].iCur = iCur;
iMove = iCur;
}

link[iMove].iCur = 0;

printf( "Now Init second link!\n");
iIndex = 0;
while( iIndex++ < iSecNum )
{
ElemType elem = InitElem();

bool bFind = false;
int iPre = iSt;
int iPos = link[iSt].iCur;
while( 1 )
{
if( ComPare( link[iPos].elem, elem ) == 0 )
{
link[iPre].iCur = link[iPos].iCur;
Free( link, iPos );
bFind = true;
break;
}


if( link[iPos].iCur == 0 )
{
break;
}

iPre = iPos;
iPos = link[iPos].iCur;
}

if( !bFind )
{
int iAdd = Malloc( link );
if( iAdd == 0 )
{
printf("Link is full!");
return iSt;
}
link[iAdd].elem = elem;
link[iAdd].iCur = link[iPos].iCur;
link[iPos].iCur = iAdd;
}
}


return iSt;
}


void main()
{
Link link;
InitStaticLink( link );


int iSt = Merge( link );
if( iSt == -1 )
{
return;
}

printf( "Now print link!\n");
Print( link, link[iSt].iCur );

getchar();
int i;
scanf("%d", &i);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值