データ構造--ダブルチェーン(C言語)

3222 ワード

二重リンク:
ダブルチェーンテーブルはシングルチェーンテーブルと違って、構造体には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); } }