一个关于双链表的C面试题

1、数据的节点定义如下面的tagData所列,该数据节点有两个索引值,分别是index1index2,请编写程序,有如下要求:

1)据上下文,由于需要分别以index1index2索引查找,请建立两个单向链表,分别以index1index2,索引值唯一,且均为从小到大

2)提供增加节点的函数和删除节点的操作,请注意增加和删除节点的操作均会影响这两个链表。

3)删除操作数据是依据index2删除的

/*节点数据*/

typedefstruct tagData

{

intindex1;

intindex2;

intiData;

structtagData *pstNext1;

structtagData *pstNext2;

}NODE_S;


/*Description:链表初始化*/

voidinit();

/*Description:加入节点*/

voidadd(int index1,int index2,int iData);

/*Description:删除节点*/

Voiddelete(int index2);






//LinkList.cpp :定义控制台应用程序的入口点。

//


#include"stdafx.h"

#include<stdlib.h>


//usingnamespace std;

typedefstructtagData

{

intindex1;

intindex2;

intiData;

structtagData *pstNext1;

structtagData *pstNext2;

}NODE_S;


NODE_S*pFirst = (NODE_S*)malloc(sizeof(NODE_S));

voidinit()

{

pFirst->index1= 0;

pFirst->index2= 0;

pFirst->iData= 0;

pFirst->pstNext1= NULL;

pFirst->pstNext2= NULL;

}


voidadd(intindex1,intindex2,intiData)

{

NODE_S*p = pFirst;

NODE_S*pNewNode = (NODE_S*)malloc(sizeof(NODE_S));

pNewNode->index1= index1;

pNewNode->index2= index2;

pNewNode->iData= iData;

pNewNode->pstNext1= NULL;

pNewNode->pstNext2= NULL;


while(p&& p->index1<index1-1)

{

p= p->pstNext1;

}

if(p)

{

pNewNode->pstNext1= p->pstNext1;//首先改变的是新加入节点的下一个指向的指针;

p->pstNext1= pNewNode;

p = pNewNode->pstNext1;

while(p)

{

p->index1++;

p= p->pstNext1;

}

}


p= pFirst;

while(p&& p->index1<index2-1)

{

p= p->pstNext2;

}

if(p)

{

pNewNode->pstNext2= p->pstNext2;

p->pstNext2= pNewNode;

p= pNewNode->pstNext2;

while(p)

{

p->index2++;

p= p->pstNext2;

}

}

}


voidDelete(intindex2)

{

NODE_S*pPre = pFirst;

NODE_S*p = pFirst->pstNext2;

while(p)

{

if(p->index2== index2)

{

break;

}

pPre= p;

p= p->pstNext2;

}

if(p)

{

pPre->pstNext2= p->pstNext2;

pPre= pPre->pstNext2;

//p= pPre;

while(pPre)

{

pPre->index2--;

pPre= pPre->pstNext2;

}

}

intindex1 = p->index1;

pPre= pFirst;

p= pPre->pstNext1;

while(p)

{

if(p->index1== index1)

{

break;

}

pPre= p;

p= p->pstNext1;

}


pPre->pstNext1= p->pstNext1;

pPre= pPre->pstNext1;

while(pPre)

{

pPre->index1--;

pPre= pPre->pstNext1;

}

free(p);

}


int_tmain(intargc, _TCHAR* argv[])

{

init();

add(0,0,4);

add(0,0,5);

add(0,0,6);

add(0,0,7);

add(0,3,8);

add(0,0,9);

add(0,0,10);

add(0,0,11);

add(0,0,4);

add(3,0,5);

add(0,0,6);

add(2,5,7);

add(0,3,8);

add(0,0,9);

add(3,8,10);

add(0,7,11);



Delete(3);


NODE_S*p = pFirst;

while(p)

{

printf("\n%d%d ",p->index1,p->iData);

p= p->pstNext1;

}

printf("\n");

p= pFirst;

while(p)

{

printf("\n%d%d ",p->index2,p->iData);

p= p->pstNext2;

}


return0;

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值