双链表的增删改查

DoubleLinkList.h         头文件的内容

#ifndef __DOUBLELINKLIST_H_
#define __DOUBLELINKLIST_H_
#define ElementType int


struct Node 
{
    ElementType data;
    struct Node *next;
    struct Node *prev;
};

struct DoubleLinkList
{
    struct Node *head;
    struct Node *tail;
    int len;
};

typedef struct DoubleLinkList DLlist;

struct Num
{
    ElementType *element;
    struct Node *address;
};

int InitDLlist(DLlist *list);//初始化双链表
void InsertTail(DLlist *list,ElementType element);//尾差法
void TravelDLlist(DLlist *list);//打印双链表
void InsertHead(DLlist *list,ElementType element);//头插法
void FreeDList(DLlist *list);//释放函数
void InsertIndex(DLlist *list,ElementType element,int index);//按位置插入
void RemoveByIndex(DLlist *list,int index);//按位置删除
int FindFirstElementIndex(DLlist *list,ElementType element);//寻找元素下标
void RemoveByElement(DLlist *list,ElementType element);//按元素删除
void SetByIndex(DLlist *list,ElementType element, int index);//按位置修改
void SetByElememt(DLlist*list,ElementType OldValue,ElementType NewValue);//按元素修改
struct Node * FindByIndex(DLlist *list,int index);//按位置查找
int *FindByElement(DLlist *list,ElementType element);//按元素查找

DLlist*FindIntersection(DLlist *list1,DLlist*list2);//找交集
void BubbleSort(DLlist *list);//冒泡法的双链表排序
#endif

DoubleLinkList.c   函数的实现

#include<stdio.h>
#include<stdlib.h>
#include "DoubleLinkList.h"



struct Node* CreateDLlistNode(ElementType element)
{
    struct Node*NewNode = (struct Node*)malloc(sizeof(struct Node));
    if(NewNode == NULL)
    {
        printf("CreateDLlistNode malloc error!!!\n");
        return NULL;
    }
    NewNode->data = element;
    return NewNode;
}


int InitDLlist(DLlist *list)
{
    list->head = NULL;
    list->tail = NULL;
    list->len = 0;
    return 0;
}


void InsertTail(DLlist *list, ElementType element)
{
    struct Node *NewNode = CreateDLlistNode(element);
    if(list->len == 0)
    {
        list->head = NewNode;
        list->tail = NewNode;
        list->len++;
        return;
    }
    list->tail->next = NewNode;
    NewNode->prev = list->tail;
    list->tail = list->tail->next;
    list->len++;
}


void TravelDLlist(DLlist *list)
{
    struct Node*TravelPoint = list->head;
    while(TravelPoint != NULL)
    {
    
        printf("%d  ",TravelPoint->data);
        TravelPoint = TravelPoint->next;
    }
    printf("\n");
}


void InsertHead(DLlist *list, ElementType element)
{

    struct Node *NewNode = CreateDLlistNode(element);
    if(list->len == 0)
    {
        list->head = NewNode;
        list->tail = NewNode;
        list->len++;
        return;
    }
    list->head->prev = NewNode;
    NewNode->next = list->head;
    list->head = list->head->prev;
    list->len++;
}


void FreeDList(DLlist *list)
{
    struct Node *Free = list->head;
    while(list->head != NULL)
    {
        list->head = list->head->next;
        free(Free);
        Free = list->head;
        
    }
    list->head = NULL;
    list->tail = NULL;
    list->len = 0;
}

void InsertIndex(DLlist *list, ElementType element, int index)
{
    if(index < 0|| index >= list->len)
    {
        printf("insertIndex place error!!!\n");
        return;
    }

    if(index == 0)
    {
        InsertHead(list,element);
        return;
    }
    else if(index == list->len-1)
    {
        struct Node*NewNode = CreateDLlistNode(element);
        NewNode->next = list->tail;
        NewNode->prev = list->tail->prev;
        list->tail->prev->next = NewNode;
        list->tail->prev = NewNode;
        list->len++;
        return;
    }
    else
    {
        struct Node *TravelPoint = list->head;
        struct Node *NewNode = CreateDLlistNode(element);
        while(index != 0)
        {
            TravelPoint = TravelPoint->next;
            index--;
        }
        NewNode->next = TravelPoint;
        NewNode->prev = TravelPoint->prev;
        TravelPoint->prev->next = NewNode;
        TravelPoint->prev = NewNode;
        
        list->len++;
    }
}


void RemoveByIndex(DLlist *list, int index)
{
    if(index < 0|| index >= list->len)
    {
        printf("RemoveByIndex place error!!!\n");
        return;
    }

    if(list->len ==0)
    {
        printf("双链表内没有元素\n");
        return;
    }

    if(index == 0)
    {
        if(list->len ==1)
        {
            free(list->head);
            list->head = NULL;
            list->tail = NULL;
            list->len = 0;
            return;
        }
        struct Node*temp = list->head;
        list->head = list->head->next;
        list->head->prev = NULL;
        free(temp);
        list->len--;
    }
    else if(index == list->len-1)
    {
        struct Node*temp = list->tail;
        list->tail = list->tail->prev;
        list->tail->next = NULL;
        free(temp);
        list->len--;
        return;
    }
    else
    {
        struct Node *TravelPoint = list->head;
        while(index != 0)
        {
            index--;
            TravelPoint = TravelPoint->next;
        }
        struct Node *temp = TravelPoint;
        TravelPoint->prev->next = TravelPoint->next;
        TravelPoint->next->prev = TravelPoint->prev;
        list->len--;
        free(temp);
    }
}

int FindFirstElementIndex(DLlist *list,ElementType element)
{
    struct Node *TravelPoint = list->head;
    int count = 0;
    while(TravelPoint !=NULL)
    {
        if(TravelPoint->data == element)
        {
            return count;
        }
        TravelPoint = TravelPoint->next;
        count++;
    }
    return -1;
}

void RemoveByElement(DLlist *list, ElementType element)
{

    int DeleteIndex = FindFirstElementIndex(list,element);
    while(DeleteIndex != -1)
    {
        RemoveByIndex(list,DeleteIndex);
        DeleteIndex = FindFirstElementIndex(list,element);

    }
}

void SetByIndex(DLlist *list,ElementType element, int index)
{
    if(index < 0|| index >= list->len)
    {
        printf("SetByIndex place error!!!\n");
        return;
    }
    struct Node*TravelPoint = list->head;
    while(index != 0)
    {
        index--;
        TravelPoint = TravelPoint->next;
    }
    TravelPoint->data = element;
}

void SetByElememt(DLlist *list, ElementType OldValue, ElementType NewValue)
{
    int SetIndex = FindFirstElementIndex(list,OldValue);
    while(SetIndex != -1)
    {
        struct Node*TravelPoint = list->head;
        while(SetIndex != 0)
        {
            SetIndex--;
            TravelPoint = TravelPoint->next;
        }
        TravelPoint->data = NewValue;
        SetIndex = FindFirstElementIndex(list,OldValue);
    }
}

struct Node *FindByIndex(DLlist *list, int index)
{
    if(index < 0 || index >= list->len)
    {
        printf("FindByIndex place error!!\n");
        return NULL;
    }
    struct Node*TravelPoint = list->head;
    while(index != 0)
    {
        index--;
        TravelPoint = TravelPoint->next;
    }
    return TravelPoint;
}

int *FindByElement(DLlist *list, ElementType element)
{
    int *ReturnArray = (int *)malloc(sizeof(int )*(list->len+1));
    int count = 0;
    int i = 0;
    struct Node*TravelPoint = list->head;

    // while(TravelPoint != NULL)
    // {
    //     if(TravelPoint->data == element)
    //     {
    //         count++;
    //         ReturnArray[count] = i;
    //     }
    //     i++;
    //     TravelPoint = TravelPoint->next;
    // }
    // ReturnArray[0] = count;

    while(TravelPoint != NULL)
    {
        if(TravelPoint->data == element)
        {
            ReturnArray[count] = i;
            count++;
        }
        i++;
        TravelPoint = TravelPoint->next;
    }
    ReturnArray[count] = -1;
    return ReturnArray;
}

DLlist *FindIntersection(DLlist *list1, DLlist *list2)
{
    struct Node* tra1 = list1->head;
    struct Node* tra2 = list2->head;
    DLlist *list3 = (DLlist*)malloc(sizeof(DLlist));
    if(list3 == NULL)
    {
        printf("FindIntersection malloc error\n");
    }
    InitDLlist(list3);
  
    while(tra1 !=NULL)
    {
        tra2 = list2->head;//warning!!!!!每次都需要重置tra2!!!!
        while(tra2 !=NULL)
        {
            if(tra1->data == tra2->data)
            {
                struct Node* tra3 = list3->head;
                int flag = 0;
            
                while(tra3 != NULL)
                {
                    if(tra3->data == tra2->data)
                    {
                        flag = 1;
                    }
                    tra3 = tra3->next;
                }
                if(flag == 0)
                {
                    InsertTail(list3,tra2->data);
                }
            }
            tra2 = tra2->next;
        }
        tra1 = tra1->next;
    }
    return list3;
}


void BubbleSort(DLlist *list)
{
    for(int i = 0;i <= list->len-1;i++)
    {
        struct Node*TravelPoint = list->head;
        for(int j = 0;j < list->len-i-1;j++)
        {
            if(TravelPoint->data > TravelPoint->next->data)
            {
                if(TravelPoint == list->head)
                {
                    struct Node *Cur = TravelPoint;
                    struct Node *Next = TravelPoint->next;
                    Cur->next = Next->next;
                    Next->prev = NULL;

                    Next->next->prev = Cur;

                    Cur->prev = Next;
                    Next->next = Cur;

                    TravelPoint = Next;//重要
                    list->head = Next;
                }

                else if(TravelPoint->next == list->tail)
                {
                    struct Node *Cur = TravelPoint;
                    struct Node *Next = TravelPoint->next;

                    Cur->next = NULL;
                    Next->prev = Cur->prev;

                    Cur->prev->next = Next;

                    Cur->prev = Next;
                    Next->next = Cur;

                    list->tail = Cur;
                }
                else
                { 
                    struct Node *Cur = TravelPoint;
                    struct Node *Next = TravelPoint->next;
                    Cur->next = Next->next;
                    Next->prev = Cur->prev;

                    Cur->prev->next = Next;
                    Next->next->prev = Cur;

                    Cur->prev = Next;
                    Next->next = Cur;

                    TravelPoint = Next;//这段代码尤其重要,若没有这段代码急急急!!!!!!!!
                    
                }
            }
            TravelPoint = TravelPoint->next;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值