帶頭結點的雙向鏈表操作(頭插法)-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");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM