静态链表的操作,哎,感觉好难啊

fxfxfxfxw 2016-02-26 09:57:01
#include<stdio.h>
struct test
{
char a;
int cur;
};
void InitSpace(struct test *space)
{
int i;
for (i = 0; i < 100-1; i++)
{
space[i].cur = i + 1;
}
space[100 - 1].cur = 0;
}
int Malloc(struct test *space)
{
int i;
i = space[0].cur;
if (space[0].cur)
space[0].cur = space[i].cur;
return i;
}
void Free(struct test *space, int k)
{
space[k].cur = space[0].cur;
space[0].cur = k;
}
int different(struct test *space)
{
InitSpace(space);
int S,r, i, m, n,b,p,k;
int j;
S = Malloc(space);
r = S;
scanf("%d", &m); //A的个数
scanf("%d", &n); //B的个数
for (j = 1; j <= m; j++)
{
i = Malloc(space);
scanf("%c", &space[i].a);
space[r].cur = i;
r = i;
}
space[r].cur = 0;
for (j = 1; j <= n; j++)
{
scanf("%c", &b);
p = S;
k = space[S].cur;
while (k != space[r].cur&&space[k].a != b)
{
p = k;
k = space[k].cur;
}
if (k == space[r].cur)
{
i = Malloc(space);
space[i].a = b;
space[i].cur = space[r].cur;
space[r].cur = i;
}
else
{
space[p].cur = space[k].cur;
Free(space, k);
if (r == k)
r = p;
}
}
return S;
}
void print(struct test *space,int S)
{
int p = space[S].cur;
while (p)
{
printf("%c\n", space[p].a);
}
}
int main()
{
struct test space[100];
int S;
S=different(space);
print(space, S);
}

看的是严奶奶里的数据结构,但不知道问题出在哪里,理解什么备用链表也有点困难,求指点
differernt的作用是若B中存在A相同的则在A里删除,无则在A里面进行插入,
...全文
600 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxfxfxfxw 2016-02-29
  • 打赏
  • 举报
回复
引用 13 楼 zhangxiangDavaid 的回复:
这是在用下标模拟指针?
是用cur来模拟指针
苏叔叔 2016-02-29
  • 打赏
  • 举报
回复
这是在用下标模拟指针?
fxfxfxfxw 2016-02-29
  • 打赏
  • 举报
回复
引用 10 楼 lm_whales 的回复:
静态链表,约等于静态内存池,效率可能要低一点
#include<stdio.h>
struct test
{
	int a;
	int cur;
};
void InitSpace(struct test *space)               
{
	int i;
	for (i = 0; i < 100 - 1; i++)
	{
		space[i].cur = i + 1;
	}
	space[100 - 1].cur = 0;
}
int Malloc(struct test *space)
{
	int i;
	i = space[0].cur;
	if (space[0].cur)
		space[0].cur = space[i].cur;
	return i;
}
void Free(struct test *space, int k)
{
	space[k].cur = space[0].cur;
	space[0].cur = k;
}
int different(struct test *space)         
{
	InitSpace(space);
	int  S, r, i, m, n, b, p, k;
	int j;
	S = Malloc(space);                      //S申请头结点
	r = S;                                 //r指向非备用链表的尾点
	scanf("%d", &m);                       //A的个数
	scanf("%d", &n);                      //B的个数
	for (j = 1; j <= m; j++)
	{
		i = Malloc(space);
		scanf("%d", &space[i].a);
		space[r].cur = i;                //连接新申请的结点
		r = i;                           //更新尾结点
	}
	space[r].cur = 0;                     //最后结点为零
	for (j = 1; j <= n; j++)
	{
		scanf("%d", &b);
		p = S;                               //p为k的上一个结点
		k = space[S].cur;                  //k指向头结点下一结点
		while (k != space[r].cur&&space[k].a != b)    //直到k指向尾结点之后或者在A中找到和A相同的
		{
			p = k;
			k = space[k].cur;
		}
		if (k == space[r].cur)               //当前表中不存在该元素,插入r结点之后
		{                                    //r的位置不变,因为r值的是A,意味着A的查询结束
			i = Malloc(space);
			space[i].a = b;
			space[i].cur = space[r].cur;
			space[r].cur = i;
		}
		else                                    //该元素已在表中,删除之
		{
			space[p].cur = space[k].cur;
			Free(space, k);
			if (r == k)                  //修改尾指针
				r = p;
		}
	}
	return S;
}
void print(struct test *space, int S)
{
	int p = space[S].cur;
	while (p)
	{
		printf("%d\n", space[p].a);
		p = space[p].cur;
	}
}
int main()
{
	struct test space[100];
	int S;
	S = different(space);
	print(space, S);
}
自己解决了,谢谢大家的帮助
赵4老师 2016-02-29
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
lm_whales 2016-02-28
  • 打赏
  • 举报
回复
静态链表,约等于静态内存池,效率可能要低一点
lm_whales 2016-02-28
  • 打赏
  • 举报
回复
有的语言没有指针,如果语言不提供表这一类数据结构的话, 可以使用静态链表
lm_whales 2016-02-28
  • 打赏
  • 举报
回复
静态链表,有时候可以看作是个单一类型内存分配系统
fxfxfxfxw 2016-02-27
  • 打赏
  • 举报
回复
引用 5 楼 qq_27479125 的回复:
你说的应该是动态数组吧,没听说过静态链表,对动态数组的操作跟链表相似,优缺点是存储麻烦,读取效率高。因为数组空间大小不知道而且连续,,来个数据临时多分配一个数据空间,然后把之前的数组复制到新数组中,不像链表可以直接插入。
http://blog.csdn.net/jiuyueguang/article/details/12090569 就是这个里面说的
fxfxfxfxw 2016-02-27
  • 打赏
  • 举报
回复
引用 4 楼 starytx 的回复:
链表和数组是完全不同的数据结构,怎么可以用数组来描述链表?数组是在内存中连续存储的一段空间。链表可能是不连续的,每个元素通过指针指向下一个元素的地址,好像用链条连着一样,所以称为链表,要访问某个元素,一般需要先从表头开始一个一个的进行遍历,数组可以直接通过下标形式来访问某个元素。

这是书上的

qq_27479125 2016-02-27
  • 打赏
  • 举报
回复
你说的应该是动态数组吧,没听说过静态链表,对动态数组的操作跟链表相似,优缺点是存储麻烦,读取效率高。因为数组空间大小不知道而且连续,,来个数据临时多分配一个数据空间,然后把之前的数组复制到新数组中,不像链表可以直接插入。
starytx 2016-02-27
  • 打赏
  • 举报
回复
链表和数组是完全不同的数据结构,怎么可以用数组来描述链表?数组是在内存中连续存储的一段空间。链表可能是不连续的,每个元素通过指针指向下一个元素的地址,好像用链条连着一样,所以称为链表,要访问某个元素,一般需要先从表头开始一个一个的进行遍历,数组可以直接通过下标形式来访问某个元素。
lee790608 2016-02-26
  • 打赏
  • 举报
回复
调试是程序员的基本功啊,难是因为你对算法没想清楚。 函数调试首先设计测试用例,针对每个分支。 首先加入第一个分支代码,屏蔽掉其它部分,调试Ok后加入第二个存在分支的地方,直到全部加入进去。 这个数据结构并不复杂,需要你有点耐心。
fxfxfxfxw 2016-02-26
  • 打赏
  • 举报
回复
引用 1 楼 ganxingguo 的回复:
什么是静态链表?
就是用数组来描述链表
逆水寒_ 2016-02-26
  • 打赏
  • 举报
回复
什么是静态链表?

70,023

社区成员

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

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