带头结点的双向链表操作(头插法)-c语言实现

博客介绍了带头结点的双向链表操作(头插法)的C语言实现,内容转载自相关博客。涉及数据结构中双向链表的操作,以C语言为实现工具。

带头结点的双向链表操作(头插法)-c语言实现

#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
typedef int ElemType;
typedef struct  LNode
{
    ElemType data;
    struct  LNode *pri;
    struct  LNode *next;
}LNode;


LNode* create_head();
LNode* create_node(ElemType data);
void InsertbyHead(LNode* head,ElemType data);
int Empty_List(LNode* head);
void Forward_Print_List(LNode* head);
void Opposite_Print_List(LNode* head);
void Insert_Node(LNode* head,ElemType data,int pos);
void Delete_Node(LNode* head,int pos);
int Find_Node(LNode* head,ElemType data);

LNode* create_head()
{
    LNode *head=(LNode*)malloc(sizeof(LNode));
    head->data=NULL;
    head->next=head;
    head->pri=head;
    return head;
}
LNode* create_node(ElemType data)
{
    LNode *newnode=(LNode*)malloc(sizeof(LNode));
    newnode->data=data;
    newnode->next=NULL;
    newnode->pri=NULL;
    return newnode;
}
void InsertbyHead(LNode* head,ElemType data)
{
    LNode *newnode=create_node(data);
    newnode->next=head->next;
    head->next=newnode;
    newnode->next->pri=newnode;
    newnode->pri=head;
}
int Empty_List(LNode* head)
{
    if(head->next==head)
    return 1;
    return 0;
}
void Forward_Print_List(LNode* head)
{
    if(Empty_List(head))return;
    LNode *p;
    p=head->next;
    while(p!=head)
    {
        printf("%d",p->data);
        p=p->next;
    }
}
void Opposite_Print_List(LNode* head)
{
    if(Empty_List(head))return;
    LNode *p;
    p=head->pri;
    while(p!=head)
    {
        printf("%d",p->data);
        p=p->pri;
    }
}
int Len_Get(LNode* head)
{
    if(Empty_List(head))return 0;
    LNode *p;
    int len=0;
    p=head->next;
    while(p!=head)
    {
        len++;
        p=p->next;
    }
    return len;
}
void Insert_Node(LNode* head,ElemType data,int pos)
{
    if(pos>Len_Get(head))return;
    LNode *newnode=create_node(data);
    LNode *p=head;
    int i=0;
    while(i!=pos)
    {
        p=p->next;
        i++;
    }
    newnode->next=p->next;
    p->next=newnode;
    newnode->next->pri=newnode;
    newnode->pri=p;    
}
void Delete_Node(LNode* head,int pos)
{
    if(pos>Len_Get(head))return;
    LNode *p=head;
    int i=0;
    while(i!=pos)
    {
        p=p->next;
        i++;
    }
    p->pri->next=p->next;
    p->next->pri=p->pri;
    free(p);
}
int Find_Node(LNode* head,ElemType data)
{
    int pos=1;
    LNode *p=head->next;
    while(p!=head)
    {
        if(p->data==data)return pos;
        pos++;
        p=p->next;
    }
    return 0;
}
void Clear_List(LNode* head)
{
    LNode *p=head->next;
    LNode *tmp;
    head->pri=head;
    head->next=head;
    while(p->next!=head)
    {
        tmp=p;
        p->pri=NULL;
        p=p->next;
        free(tmp);
    }
    p->next=NULL;
    p->pri=NULL;
    free(p);
    
} 
void main()
{
    LNode *L=create_head();
    InsertbyHead(L,4);
    InsertbyHead(L,5);
    InsertbyHead(L,7);
    InsertbyHead(L,9);
    InsertbyHead(L,8);
    Insert_Node(L,7,1);
    Delete_Node(L,1);
    Clear_List(L);
    Forward_Print_List(L);
//    Opposite_Print_List(L);
    printf(" 查找的元素位置为:%d",Find_Node(L,9));
    printf(" 长度为%d",Len_Get(L));
    system("pause");
}

 

转载于:https://www.cnblogs.com/ljh-blog/p/10820677.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值