Cclass5——双向链表

//带表头结点的双向链表
#include <stdio.h>
#include <stdlib.h>
#define MAL_OK 1
#define MAL_ERR 0

struct dblnode
{
    int num;
    struct dblnode * next;
	struct dblnode * prior;
};

typedef struct dblnode DblNode;
typedef struct dblnode * DblLink;

void creat_link(DblLink * head);                        
void creat_node(DblLink * new_node, int i);             
int  judge_node(DblLink new_node);                      
void insert_node_head(DblLink new_node, DblLink head);     
void insert_node_tail(DblLink new_node, DblLink head);     
void insert_node_mid(DblLink new_node, DblLink head, int num_loc);   
void delete_node(DblLink head, int num_del);          
void display(DblLink head);                           
void release_link(DblLink * head);                   
void makempty_link(DblLink head);
void reverse_link(DblLink * head);
int length_link(DblLink head);

int main()
{
    DblLink head = NULL;                              
    DblLink new_node = NULL;                          
    int i, num_loc, num_val, num_del,n;               

    creat_link(&head);                              

    for (i = 0;i < 10;i++)
    {
        creat_node(&new_node,i);                   
        insert_node_head(new_node,head);
        //insert_node_tail(new_node,head);           
    }
    display(head);
    printf("链表的长度为:%d\n",n = length_link(head));
    printf("************\n");

    printf("输入待插入元素的位置和数值\n");
    scanf("%d%d",&num_loc,&num_val);                
    creat_node(&new_node,num_val);                  
    insert_node_mid(new_node,head,num_loc);        
    display(head);
    printf("链表的长度为:%d\n",n = length_link(head));
    printf("***************\n");

    printf("输入待删除元素的数值\n");
    scanf("%d",&num_del);                           
    delete_node(head, num_del);                     
    display(head);
    printf("链表的长度为:%d\n",n = length_link(head));
    printf("***************\n");

    makempty_link(head);
    //release_link(&head);
    display(head);
    return 0;
}

void creat_link(DblLink * head)                         
{
    DblLink new_node;
    new_node = (DblLink)malloc(sizeof(DblNode));
    *head = new_node;
    new_node->num = 999;
    new_node->next = new_node->prior = *head;
}

int judge_node(DblLink new_node)                       
{
    if (new_node == NULL)
        return MAL_ERR;
    else 
        return MAL_OK;
}

void creat_node(DblLink * new_node, int i)             //创建结点包括申请内存分配和给num赋值
{
    do
    {
        *new_node = (DblLink)malloc(sizeof(DblNode));
    }while(judge_node(*new_node) == MAL_ERR);
    (*new_node)->num = i;
}

void insert_node_head(DblLink  new_node, DblLink  head)  
{
    /*if (length_link(head) == 0)     //提醒!!!
        head->prior = new_node;       //分情况讨论
    else
        head->next->prior = new_node;
    new_node->next = head->next; 
	new_node->prior = head;
    head->next = new_node;  
    */
    DblLink p = head->next;         //定义一个指向表头下一个结点的指针
    new_node->next = p;
    new_node->prior = head;
    head->next = new_node;
    p->prior = new_node;
}

void insert_node_tail(DblLink new_node, DblLink head)   //尾插结点
{
    DblLink p = head->prior;
    new_node->next = head;
    new_node->prior = p;
    p->next = new_node;
    head->prior = new_node;
}

void insert_node_mid(DblLink new_node, DblLink head, int num_loc)//中插(前插)
{
    DblLink p;
    p = head; 
    
    while(p->num != num_loc && p->next != head)  //寻找待插入值的所在位置
        p = p->next;                             
    
    if(p->next == head && p->num != num_loc )   //未找到,尾插
    {
        p->next = new_node;
        head->prior = new_node;
        new_node->next = head;
        new_node->prior = p;
    }
    else                                              
    {
        new_node->next = p;
        new_node->prior = p->prior;
        p->prior->next = new_node;
        p->prior = new_node;
    }
}

void delete_node(DblLink head, int num_del)          //删除结点
{
    DblLink p = head;

    while(p->num != num_del && p->next != head)  
        p = p->next;                             

	if(p->next == head && p->num != num_del) 
		printf("待删除元素未找到\n");
	else                                     
	{
		p->prior->next = p->next;
        p->next->prior = p->prior;
		free(p);
	}
}

void display(DblLink head)
{
    DblLink p = head;                   // 提醒 !!! 
    if (head == NULL)
        printf("链表不存在\n");
    else if(head->next == head)
        printf("链表为空\n");
    else
    {
        p = head->next;
        while(p != head)
        {
            printf("num = %d\n",p->num);
            p = p->next;
        }
    } 
}

void makempty_link(DblLink head)				//清空链表
{
    DblLink p = head;
    if (head == NULL)
        printf("Link is null!!!!!!!\n");
    else 
    {   
        p = p->next;
        while(p != head)
        {
            p = p->next;
            free(p->prior);
        }
        p->next = head;
        p->prior = head;
    }
    if (length_link(head) == 0)
        printf("链表清空完毕,其长度为%d\n",length_link(head));
    else
        printf("清空失败\n");
}

void release_link(DblLink * head)
{
    DblLink p = *head;
    if (*head == NULL)
        printf("Link is empty!!!!!!!\n");
    else 
    {   
        p = p->next;
        while(p != *head)
        {
            p = p->next;
            free(p->prior);
        }
    }
    *head = NULL;
    free(*head);    
}


int length_link(DblLink head)
{
    DblLink p = head->next;
    int count = 0;
    while (p != head)
    {
        p = p->next;
        count++;
    }
    return count;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值