一道华三笔试题, 100分求解!给出思路即可,有代码更好!

hnzmdzcm 2013-10-27 10:46:49
数据的节点定义如下面的tagData所列,该数据节点有两个索引值,分别是index1和index2,请编写程序,有如下要求:
1)据上下文,由于需要分别以index1和index2索引查找,请建立两个单向链表,分别以index1和index2,索引值唯一,且均为从小到大
2)提供增加节点的函数和删除节点的操作,请注意增加和删除节点的操作均会影响这两个链表。
3)删除操作数据是依据index2删除的
/*节点数据*/
typedef struct tagData
{
int index1;
int index2;
int iData;
struct tagData *pstNext1;
struct tagData *pstNext2;
}NODE_S;

/*Description:链表初始化*/
void init();
/*Description:加入节点*/
void add(int index1,int index2,int iData);
/*Description:删除节点*/
Void delete(int index2);
...全文
342 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2013-10-28
  • 打赏
  • 举报
回复
使用排序插入,二分法查找位置,即插入后保证是按索引值排序的 对插入位置的断开链表,将新节点加人 分别对两个索引量执行相同的操作
光流溢彩 2013-10-28
  • 打赏
  • 举报
回复
写了一个 ,不知道对不对。。。


typedef struct tagData
 {
 int index1;
 int index2;
 int iData;
 struct tagData *pstNext1;
 struct tagData *pstNext2;
 }NODE_S;


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "head.h"
NODE_S *pHead1,*pHead2;
//链表初始化
void init()
{
	pHead1=(NODE_S*)malloc(sizeof(NODE_S));
	memset(pHead1,0,sizeof(NODE_S));
	pHead1->next1=NULL;
	pHead1->next2=NULL;
	pHead1->index1=0;

	pHead2=(NODE_S*)malloc(sizeof(NODE_S));
	memset(pHead2,0,sizeof(NODE_S));
	pHead2->next1=NULL;
	pHead2->next2=NULL;
	pHead2->index2=0;
}
void destory(NODE_S *Head,int iNum)
{
	NODE_S *tHead=Head;
	if (1==iNum)
	{
		Head=Head->next1;
	}
	else
	{
		Head=Head->next2;
	}
	while ( Head->next1!=NULL )
	{
		free(tHead);
		tHead=Head;
		if (1==iNum )
		{
			Head=Head->next1;
		}
		else
		{
			Head=Head->next2;
		}
	}
	tHead=NULL;
}
//节点插入
void Add(int index1,int index2,int iData)
{
	//排序插入pHead1;
	NODE_S *tHead1,*tHead2,*tNode1,*tNode2;
	int Count=0;
	tHead1=pHead1;
	tHead2=pHead2;
	if (0==tHead1->index1)
	{
		tHead1->iData=iData;
		tHead1->index1=index1;
		tHead1->index2=index2;
		tHead1->next2=NULL;
		tHead1->next1=NULL;
	}
	else
	{
		if (tHead1->index1>index1)
		{
			tNode1=(NODE_S*)malloc(sizeof(NODE_S));
			tNode1->iData=iData;
			tNode1->index1=index1;
			tNode1->next1=tHead1;
			tNode1->index2=index2;
			tNode1->next2=NULL;
			pHead1=tNode1;
		}
		else
		{
			while (tHead1->next1!=NULL &&index1>=tHead1->next1->index1 )
			{
				tHead1=tHead1->next1;
			}
			tNode1=(NODE_S*)malloc(sizeof(NODE_S));
			tNode1->iData=iData;
			tNode1->index1=index1;

			tNode1->next1=tHead1->next1;
			tHead1->next1=tNode1;
			tNode1->next2=NULL;
			tNode1->index2=index2;
		}
		
	}
	
	if (0==tHead2->index2)
	{
		tHead2->iData=iData;
		tHead2->index2=index2;
		tHead2->index1=index1;
		tHead2->next1=NULL;
		tHead2->next2=NULL;
	}
	else
	{
		if (tHead2->index2>index2)
		{
			tNode2=(NODE_S*)malloc(sizeof(NODE_S));
			tNode2->iData=iData;
			tNode2->index2=index2;
			tNode2->next2=tHead2;
			tNode2->index1=index1;
			tNode2->next1=NULL;
			pHead2=tNode2;
		}
		else
		{
			while ( tHead2->next2!=NULL && index2>=tHead2->next2->index2)
			{
				tHead2=tHead2->next2;
			}
			tNode2=(NODE_S*)malloc(sizeof(NODE_S));
			tNode2->iData=iData;
			tNode2->index2=index2;

			tNode2->next2=tHead2->next2;
			tHead2->next2=tNode2;
			tNode2->next1=NULL;
			tNode2->index1=index1;
		}
		
	}
}
void ShowList(NODE_S* pHead,int iNum)
{
	NODE_S *tHead=pHead;
	while (NULL!=tHead)
	{
		if (1==iNum)
		{
			//printf(" %d-%d ",tHead->iData,tHead->index1);
			printf(" %d ",tHead->index1);
			tHead=tHead->next1;
		}
		else
		{
			//printf(" %d-%d ",tHead->iData,tHead->index2);
			printf(" %d ",tHead->index2);
			tHead=tHead->next2;
		}	
	}
}
void Delete(int index2)
{
	NODE_S *tHead1=pHead1->next1,*tHead2=pHead2->next2;
	NODE_S *f_tHead1=pHead1,*f_tHead2=pHead2;
	int count=0;
	if (tHead1->index2==index2)
	{
		free(pHead1);
		pHead1=tHead1;
	}
	if (tHead2->index2==index2)
	{
		free(pHead2);
		pHead2=tHead2;
	}
	while (tHead1!=NULL &&tHead1->index2!=index2)
	{
		f_tHead1=tHead1;
		tHead1=tHead1->next1;
	}
	while (tHead2!=NULL && tHead2->index2!=index2)
	{
		f_tHead2=tHead2;
		tHead2=tHead2->next2;
	}
	if (tHead1!=NULL)
	{
		f_tHead1->next1=tHead1->next1;
		free(tHead1);
		count++;
	}
	if (tHead2!=NULL)
	{
		f_tHead2->next2=tHead2->next2;
		free(tHead2);
		count++;
	}
	if (count==2)//去除重复节点
	{
		Delete(index2);
	}
}
int main(int argc,char *argv[])
{
	init();
	Add(5,5,10);
	Add(2,2,11);
	Add(4,4,12);
	Add(6,9,13);
	Add(3,1,14);
	Add(8,5,15);
	Add(99,8,16);
	Add(6,3,17);
	ShowList(pHead1,1);
	printf("\n\n");
	ShowList(pHead2,2);
	printf("\n\n");
	Delete(5);
	ShowList(pHead1,1);
	printf("\n\n");
	ShowList(pHead2,2);
	destory(pHead1,1);
	destory(pHead2,2);
	return 0;
}
asdf20071203 2013-10-28
  • 打赏
  • 举报
回复
看来我的理解能力真差
光流溢彩 2013-10-28
  • 打赏
  • 举报
回复

void add(int index1,int index2,int iData);
这个里面 的 index1和index2 是插入链表的索引哦?

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧