C搜索/插入中的链接列表

时间:2014-11-11 06:04:27

标签: c null doubly-linked-list

我试图编写用于在计算机中模拟MMU的代码(有点无关紧要),在调试器中经过断点后,我发现我遇到了麻烦用于搜索和插入的链表。

如果我没有包含该行" table-> first = NULL;"然后我得到一个访问冲突错误,因为它跳过了#34; if(table-> first == NULL){"在我的插入功能中。

此外,当我尝试使用我的搜索功能时(在将一个节点插入列表之后),while循环将进行第二次迭代(即使不应该是表 - >当前点的任何内容to)然后在该行上引起另一次访问冲突" sum = table-> current-> end - table-> current-> start;"

是否存在链接列表和我丢失的NULL值?我还尝试将while循环条件(在我的搜索功能中)更改为" while(table-> current)"和"而(table-> current!= 0)"这两种变化都没有区别。你可以忽略所有的pthread部分,我把它们注释掉了,因为我在windows机器/避风港上进行调试还没到那个部分。

感谢您提供任何建议!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <pthread.h>

#define max_size 20

struct node //nodes for double linked list
{
  int start;
  int end;
  int free; //Tags for removal
  struct node *prev;
  struct node *next;
};

typedef struct node node;

typedef struct //double linked list struct for page table
{
  node *first;
  node *last;
  node *current;
  int is_available; //Determines whether or not enough space is available
} page_table;

//pthread_mutex_t mux;
page_table* table;

void Insert(node *old, node *newnode, int size);
void Remove(node *node);
node* Search(int size);
void tagRemove(int size);

int main()
{
  table = (page_table*) malloc(sizeof(page_table));
  table->first = NULL;
  table->last = NULL;
  node* node1 = (node*) malloc(sizeof(node));
  node* node2 = (node*) malloc(sizeof(node));
  node* node3 = (node*) malloc(sizeof(node));
  node* node4 = (node*) malloc(sizeof(node));
  Insert(NULL, node1, 2);
  node* temp = Search(3);
  //Insert(temp, node2, 3);
  //temp = Search(4);
  //Insert(temp, node3, 4);
}

void Insert(node *old, node *newnode, int size)
{
  if(table->first == NULL){
    table->first = newnode;
    table->last = newnode;
    newnode->start = 0;
  }
  else if(old->next == NULL){
    old->next = newnode;
    newnode->prev = old;
    table->last = newnode;
    newnode->start = old->end;
  }
  else if(old == table->first){
    newnode->next = table->first;
    table->first->prev = newnode;
    table->first = newnode;
    newnode->start = 0;
  }
  else{
    newnode->next = old->next;
    old->next = newnode;
    newnode->prev = old;
    newnode->start = old->end;
  }
  newnode->end = newnode->start + size;
  newnode->free = 0;
  table->current = newnode;
}

void Remove(node *node)
{

  if(node == table->first && node == table->last) {
    table->first = NULL;
    table->last = NULL;
  } else if(node == table->first) {
    table->first = node->next;
    table->first->prev = NULL;
  } else if (node == table->last) {
    table->last = node->prev;
    table->last->next = NULL;
  } else {
    node->next->prev = node->prev;
    node->prev->next = node->next;
  }
}

node* Search(int size){
  table->current = table->first;
  int temp_size;
  int sum = 0;
  while(table->current != NULL){
    temp_size = 0;
    sum = table->current->end - table->current->start;
    if(sum>=max_size)
      return NULL;
    temp_size = table->current->end - table->current->start;
    table->current = table->current->next;
    if(size<=temp_size)
      return table->current->prev;
  }
  return 0;
}

void tagRemove(int size)
{
  int sum;
  node* temp = table->first;
  sum = temp->end - temp->start;
  temp->free = 1;
  while(temp != NULL){
    temp = temp->next;
    sum += temp->end - temp->start;
    temp->free = 1;
    if(sum < size)
      return;
  }
}

2 个答案:

答案 0 :(得分:0)

如果您始终使用calloc代替malloc,则可以省去很多麻烦。 calloc清除它分配给全零的内存,而malloc则没有。通过快速浏览代码,您可能希望将所有已分配的内存归零。

案例,node1->nextnode1->prev未初始化,但在您将node1插入表格后,您会在搜索过程中使用它们。

答案 1 :(得分:0)

你试过吗

node1->next=NULL
Insert(NULL, node1, 2);
node* temp = Search(3);

?这会产生同样的错误吗?