データ構造--ダブルチェーン(C言語)
3222 ワード
二重リンク:
ダブルチェーンテーブルはシングルチェーンテーブルと違って、構造体には2つのポインタがあります.「Next」は直接後継を指します.「Prior」は直接前駆を指します.チェーンテーブルのアクセスはシングルチェーンテーブルの一方通行ではなく、nextとprorポインタを利用して双方向アクセスができます.
実装:
ダブルチェーンテーブルはシングルチェーンテーブルと違って、構造体には2つのポインタがあります.「Next」は直接後継を指します.「Prior」は直接前駆を指します.チェーンテーブルのアクセスはシングルチェーンテーブルの一方通行ではなく、nextとprorポインタを利用して双方向アクセスができます.
実装:
//
typedef struct node{
int data;
struct node *next;
struct node *prior;
}Node;
#include "Link2.h"
//
//return:
Node *init_list()
{
Node *head;
head = (Node *)malloc(sizeof(Node));
if(!head)
{
printf("Error!
");
exit(1);
}
head->data = 0;
head->next = NULL;
head->prior = NULL;// NULL
return head;
}
//
//@num:
//@head:
void add_node(int num,Node *head)
{
if(!head)
{//
printf("The list is empty!
");
return ;
}
Node *p,*q;
p = head;
q = head;
while(q->next)// q
q=q->next;
while(num--)
{
p = (Node *)malloc(sizeof(Node));
printf("input data to add:");
scanf("%d",&p->data);
p->next = NULL;// next NULL( )
p->prior = q;// q
q->next = p;// p " " q , p
q = p;//q
}
}
//
//@no:
//@head:
//return: , -1( -1)
int delete_node(int no,Node *head)
{
if(!head)
{
printf("The list is empty!
");
return -1;
}
Node *p,*q;
int value;
p = head;
while(no-- && p->next)
{
p = p->next;
if(!p->next && no > 0)
{// p no 0 ,
printf("The length is less than \'no\'
");
return -1;
}
}
q = p->prior;//q p
q->next = p->next;//q next p , p
if(p->next)// p , p prior q
p->next->prior = q;
value = p->data;
free(p);
p = NULL;
return value;
}
//
//@no:
//@value:
//@head:
//return: , -1
int change_node(int no,int value,Node *head)
{
if(!head)
{
printf("The list is empty!
");
return -1;
}
int oldvalue;
Node *p = head;
while(p->next && no--)
{
p = p->next;
if(!p->next && no > 0)
{
printf("The list is less than no
");
return -1;
}
}
oldvalue = p->data;
p->data = value;
return oldvalue;
}
//
//@no:
//@head:
//return: , -1
int search_node(int no,Node *head)
{
if(!head)
{
printf("The list is empty!
");
return -1;
}
Node *p = head;
while(p->next && no--)
{
p = p->next;
if(!p->next && no > 0)
{
printf("The list is less than no!
");
return -1;
}
}
return p->data;
}
//
//@head:
void destroy_list(Node **head)
{
if(!*head)
{
printf("The list is empty!
");
return ;
}
Node *p = *head;
while(p->next)
{// head , head
p = p->next;
(*head)->next = p->next;
p->next = NULL;
p->prior = NULL;
free(p);
p = *head;
}
free(p);//
p = NULL;
*head = NULL;
}
//
//@head:
void print_list(Node *head)
{
if(!head)
{
printf("The list is empty!
");
return ;
}
Node *p = head;
while(p->next)
{
p = p->next;
printf("%d
",p->data);
}
}