ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C----双向链表

2021-09-04 18:00:58  阅读:140  来源: 互联网

标签:---- return List tempNode Next 链表 双向 newNode Prev


1、定义链表结构

#define   ElementType int
#define   ElementTypeNULL -1

//节点
typedef struct Node {
    ElementType Element;
    struct Node *Prev;
    struct Node *Next;
} Node;

typedef Node *List;

2、链表操作


//创建一个新节点
List NewNode(ElementType elem) {
    List L = (List) malloc(sizeof(Node));
    L->Next = NULL;
    L->Prev = NULL;
    L->Element = elem;
    return L;
}

//初始化链表
List InitLink(ElementType elem) {
    return NewNode(elem);
}

//是否是最后一个节点
int IsLast(List L) {
    return L->Next == NULL;
}

//寻找尾结点
List FindEndNode(List L) {
    while (L->Next) {
        L = L->Next;
    }
    return L;
}

//寻找头结点
List FindFirstNode(List L) {
    while (L->Prev) {
        L = L->Prev;
    }
    return L;
}

// 头插节点
List AddFirstNode(List L, ElementType elem) {
    List newNode = NewNode(elem);
    newNode->Next = L;
    L->Prev = newNode;
    return newNode;
}

// 尾插节点
List AddEndNode(List L, ElementType elem) {
    List newNode = NewNode(elem);
    List endNode = FindEndNode(L);
    endNode->Next = newNode;
    newNode->Prev = endNode;
    return L;
}

//获取长度
int GetLength(List L) {
    int i = 0;
    while (L) {
        i++;
        L = L->Next;
    }
    return i;
}

// 按索引插节点
List AddNodeFromIndex(List L, unsigned int Index, ElementType elem) {
    List tempNode = GetNodeFromIndex(L, Index);
    List newNode = NewNode(elem);
    newNode->Next = tempNode->Next;
    tempNode->Next = newNode;
    tempNode->Next->Prev = newNode;
    newNode->Prev = tempNode;
    return L;
}

//获取指定索引的值
ElementType GetElemFromIndex(List L, unsigned int Index) {
    if (Index > GetLength(L)) {
        printf("Error: index is not true");
        return ElementTypeNULL;
    }
    return GetNodeFromIndex(L, Index)->Element;
}

//获取指定索引的节点
List GetNodeFromIndex(List L, unsigned int Index) {
    if (Index > GetLength(L)) {
        printf("Error: index is not true");
        return NULL;
    }
    int i = 0;
    while (i != Index) {
        L = L->Next;
        i++;
    }
    return L;
}

//获取前一个节点
List GetPreviousNode(List L, List node) {
    return node->Prev;
}


//取下节点
List TakeNode(List L);

// 头删节点
List DelFirstNode(List L) {
    List tempNode = L->Next;
    L->Next->Prev = NULL;
    free(L);
    return tempNode;
}


// 尾删节点
List DelEndNode(List L) {
    List endNode = FindEndNode(L);
    List preNode = GetPreviousNode(L, endNode);
    preNode->Next = NULL;
    free(endNode);
    return L;
}

// 按索引删节点
List DelNodeFromIndex(List L, unsigned int Index) {
    List tempNode = GetNodeFromIndex(L, Index);

    tempNode->Prev->Next = tempNode->Next;
    tempNode->Next->Prev = tempNode->Prev;

    free(tempNode);
    return L;
}

//翻转链表,双向链表好像不需要
List ReverseList(List L) {
    List next;
    List prev = NULL;
    while (L != NULL) {
        next = L->Next;
        L->Next = prev;
        prev = L;
        L = next;
    }
    return prev;
}

//打印链表
void Display(List L) {
    while (L) {
        printf("%d ==>", L->Element);
        L = L->Next;
    }
    printf("NULL\n");
}

标签:----,return,List,tempNode,Next,链表,双向,newNode,Prev
来源: https://blog.csdn.net/weixin_51560951/article/details/120103359

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有