c - 用于检查值是否存在于链表中的 c 函数
问题描述
我有两个带有行、列和值的链接列表,我试图为此编写一个函数来检查条目是否也存在于下一行中。所以例如给定row5 col2,检查row6是否存在,然后col2是否存在于row6中。不知何故,该功能没有运行,我希望有人可以帮助我。如果您需要更多代码或解释,请联系我。
提前感谢
大卫
/*
row: 1
column: 3 value: 0
column: 7 value: 0
row: 5
column: 2 value: 0
column: 6 value: 0
row: 6
column: 2 value: 0
*/
// Row list
struct row_list
{
int row_number;
struct row_list *link_down;
struct value_list *link_right;
};
// Column list + value
struct value_list
{
int column_index;
int value;
struct value_list *next;
};
// col list
void create_value_node(unsigned int data, unsigned int j, struct row_list **z)
{
struct value_list *temp, *d;
temp = (struct value_list*)malloc(sizeof(struct value_list));
temp->column_index = j;
temp->value = data;
temp->next = NULL;
if ((*z)->link_right==NULL)
(*z)->link_right = temp;
else
{
d = (*z)->link_right;
while(d->next != NULL)
d = d->next;
d->next = temp;
}
}
// row list
void create_row_list(struct row_list **start, unsigned int row, unsigned int column, struct array *p)
{
for (unsigned int i = 0; i < row; i++)
{
struct row_list *z, *r;
unsigned int rx = p[i].x;
z = (struct row_list*)malloc(sizeof(struct row_list));
z->row_number = rx;
z->link_down = NULL;
z->link_right = NULL;
if (i==0)
*start = z;
else
{
r = *start;
while (r->link_down != NULL)
r = r->link_down;
r->link_down = z;
}
while(p[i].x==rx)
{
create_value_node(0, p[i].y, &z);
i++;
}
i--;
}
}
bool function(struct row_list *start,int x, int y){
struct row_list *tmpr;
struct value_list *tmpc;
tmpr=start;
int currow = x;
while((tmpr->row_number)<currow){
tmpr=tmpr->link_down;
}
if (tmpr->link_right != NULL)
{ tmpc = tmpr->link_right;}
int curcol = y;
tmpr=tmpr->link_down;
if((tmpr->row_number)==(currow+1)){
while (tmpc != NULL) {
if((tmpc->column_index)==curcol) {
return true;
}
if((tmpc->column_index)>curcol) {
return false;
}
tmpc=tmpc->next;
}
}
return false;
}
int main(){
if(function(start,x,y)){
printf("*%u*%u*%u***\n\n",x,y,v);
}
解决方案
我看到三个错误function
在这段代码中:
while((tmpr->row_number)<currow){
tmpr=tmpr->link_down;
}
您不检查是否为tmpr
NULL,因此您最终可能会取消引用 NULL 指针。而是尝试:
while((tmpr->row_number)<currow){
tmpr=tmpr->link_down;
if (tmpr == NULL) return false;
}
在这段代码中:
if (tmpr->link_right != NULL)
{ tmpc = tmpr->link_right;}
您仅在不为 NULLtmpc
时进行初始化。link_right
所以稍后,即在这里
while (tmpc != NULL) {
您可以使用未初始化的tmpc
一个简单的解决方法是总是做作业
tmpc = tmpr->link_right;
不管的价值link_right
在这段代码中:
tmpr=tmpr->link_down;
你改变tmpr
了,但你从不检查 NULL。所以在这里:
if((tmpr->row_number)==(currow+1)){
您可能正在取消引用 NULL 指针。
所以添加这个额外的检查:
tmpr=tmpr->link_down;
if (tmpr == NULL) return false;
推荐阅读
- android - 如何在 Android 活动中打开某种文件类型?
- javascript - Ajax 获取传递值到下一次获取
- c++ - Windows 10 上的 OpenGL SwapBuffers() 延迟
- python - 把你放在文本python前面
- python-3.x - Django 从 html 表单文件字段中保存文件
- android - 分析 Android 设备上的内存使用情况(堆、堆栈、GPU 的 OpenCL 缓冲区)
- javascript - 我之前的问题的一个附带问题:三元运算符
- continuous-integration - Gitlab - 提交时自动格式化代码
- javascript - 如何根据屏幕高度设置变量
- python - 如何在 Python 中计算两个不同数据结构中两个数字节点之间的增量?