📄 link.c
字号:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include "link.h"
void link_init(C_CLASS LINKLIST* link)
{
NODE* node;
link->THIS = link;
node = (NODE*)malloc(sizeof(NODE));
init_node(node);
link->head = node;
link->rearptr = link->head;
link->count = 0;
link->insert_rear = link_insert_rear;
link->get_node_by_key = link_get_node_by_key;
link->get_index_by_key = link_get_index_by_key;
link->delete_node_by_key = link_delete_node_by_key;
link->get_node_by_index = link_get_node_by_index;
link->replace_node_by_index = link_replace_node_by_index;
link->delete_node_by_index = link_delete_node_by_index;
link->clear_link = link_clear;
link->del = link_del;
}
void link_insert_rear(C_CLASS LINKLIST* link,void *data,int size)
{
NODE *newnode=NULL;
newnode=(NODE *)malloc(sizeof(NODE));
if(!newnode )
{
return;
}
newnode->data=data;
newnode->prior=NULL;
newnode->next=NULL;
if (!link->count)
{
link->head=newnode;
}
else
{
link->rearptr->next=newnode;
newnode->prior=link->rearptr;
}
link->rearptr=newnode;
link->count++;
}
NODE* link_get_node_by_key(C_CLASS LINKLIST* link,char* key,int (*condition)(void *p1,void *p2))
{
NODE *temp=link->head;
while(temp)
{
if(!(*condition)(temp->data,key))
{
return temp;
}
temp=temp->next;
}
return NULL;
}
int link_get_index_by_key(C_CLASS LINKLIST* link,char* key,int (*condition)(void *p1,void *p2))
{
NODE *temp=link->head;
int index=0;
while(1)
{
if(!(*condition)(temp->data,key))
{
return index;
}
temp=temp->next;
index++;
}
return -1;
}
int link_delete_node_by_key(C_CLASS LINKLIST* link,char* key,int (*condition)(void *p1,void *p2))
{
NODE *temp=link->head;
while(temp)
{
if(!(*condition)(temp->data,key))
{
temp->prior->next=temp->next;
temp->next->prior=temp->prior;
free(temp);
link->count--;
return 1;
}
temp=temp->next;
}
return 0;
}
NODE* link_get_node_by_index(C_CLASS LINKLIST* link,int index)
{
NODE *temp=link->head;
int i=0;
for(i=0;i<index-1;i++)
{
temp=temp->next;
}
if(temp==NULL)
{
return NULL;
}
return temp;
}
int link_replace_node_by_index(C_CLASS LINKLIST *link,int index,void *data,int size)
{
NODE *temp = link->head;
NODE *newnode = NULL;
int i = 1;
newnode = (NODE*)malloc(size);
if (!newnode)
{
return;
}
newnode->data = data;
newnode->next = NULL;
newnode->prior = NULL;
if (link->count==1)
{
link->head = newnode;
link->rearptr = newnode;
free(temp);
return 1;
}
if (index==1)
{
newnode->next = link->head->next;
link->head->next->prior = newnode;
link->head = newnode;
link->head->prior = NULL;
free(temp);
return 1;
}
if (index==link->count)
{
temp = link->rearptr;
newnode->prior = link->rearptr->prior;
link->rearptr->prior->next = newnode;
link->rearptr = newnode;
link->rearptr->next = NULL;
free(temp);
return 1;
}
for (i=1;i<index;i++)
{
temp = temp->next;
}
if ( index > link->count )
{
return -1;
}
newnode->next = temp->next;
newnode->prior = temp->prior;
temp->prior->next = newnode;
temp->next->prior = newnode;
free(temp);
return 1;
}
int link_delete_node_by_index(C_CLASS LINKLIST* link,int index)
{
NODE *temp=link->head;
int i = 1;
if (link->count==1)
{
link->head=NULL;
link->rearptr=NULL;
free(temp);
link->count--;
return 1;
}
if (index==1)
{
link->head=link->head->next;
link->head->prior=NULL;
free(temp);
link->count--;
return 1;
}
if (index==link->count)
{
temp=link->rearptr;
link->rearptr=link->rearptr->prior;
link->rearptr->next=NULL;
free(temp);
link->count--;
return 1;
}
for(i=1;i<index;i++)
{
temp = temp->next;
}
if (index>link->count)
{
return -1;
}
temp->prior->next=temp->next;
temp->next->prior=temp->prior;
free(temp);
link->count--;
return 1;
}
void link_clear(C_CLASS LINKLIST* link)
{
int i = 1;
NODE *temp = NULL;
int n=link->count;
for ( i=1; i<=n; i++)
{
temp = link->rearptr;
if (link->count!=1)
{
link->rearptr = link->rearptr->prior;
}
link->rearptr->next = NULL;
free(temp->data);
free(temp);
link->count--;
}
link->head = NULL;
link->rearptr = NULL;
}
void link_del(C_CLASS LINKLIST* link)
{
int i = 2;
NODE *temp = NULL;
int n=link->count;
for ( i=2; i<=n; i++)
{
temp = link->rearptr;
if (link->count!=1)
{
link->rearptr = link->rearptr->prior;
}
link->rearptr->next = NULL;
free(temp);
link->count--;
}
}
void init_node(NODE* n)
{
}
NODE* create_node(void *data,int size)
{
return NULL;
}
void free_node(NODE *n)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -