当前位置:网站首页 > 区块链基础 > 正文

单向链表结构图(单向链表有什么特征)



//----------------单链表的存储结构--------------------

typedef struct LNode

{

} LNode, *LinkList;    // LinkList 为指向结构体 LNode 的指针类型

    一般情况下,为了处理方便,在单链表的第一个结点之前附设一个结点,称之为头结点。

----------------------------此处省略一张图--------------------------

    下面对首元结点、头结点、头指针三个容易混淆的概念加以说明。

    (1)便于首元结点的处理

#include <stdio.h>

#include <stdlib.h>

typedef struct LNode

{

    int data;

    struct LNode* next;

} LNode, *LinkList; // LinkList 为指向结构体 LNode 的指针类型

void CreateList_H(LinkList *L, int n);

void CreateList_R(LinkList *L, int n);

void TraverseList(LinkList L);

void ReverseList(LinkList L);

void FreeList(LinkList *L);

int GetElem(LinkList L, int i, int* e);

int ListInsert(LinkList *L, int i, int e);

int ListDelete(LinkList *L, int i);

int main()

{

    LinkList L;

    L = NULL;

    int n;

    printf("请输入链表的长度:");

    scanf("%d", &n);

    CreateList_R(&L, n);

    TraverseList(L);

    // ReverseList(L);

    // TraverseList(L);

    // int flag, i, e;

    // while (1)

    // {

    //     printf("请输入要取值的结点序号(输入负数退出):");

    //     scanf("%d", &i);

    //     if (i < 0) break;

    //     flag = GetElem(L, i, &e);

    //     if (flag) printf("指定的序号不合法 ");

    //     else printf("对应结点的值为:%d ", e);

    // }

    // int flag, i, e;

    // while (1)

    // {

    //     printf("请输入插入位置:");

    //     scanf("%d", &i);

    //     if (i < 0) break;

    //     printf("请输入插入的值:");

    //     scanf("%d", &e);

    //     flag = ListInsert(&L, i, e);

    //     if (flag) break;

    //     TraverseList(L);

    // }

    int flag, i;

    while (1)

    {

        printf("请输入要删除结点的序号:");

        scanf("%d", &i);

        if (i < 1) break;

        flag = ListDelete(&L, i);

        if (flag) break;

        TraverseList(L);

    }

   

    FreeList(&L);

    return 0;

}

void TraverseList(LinkList L)

{

    LNode* p;

    p = L->next;

    while (p)

    {

        printf("->%d", p->data);

        p = p->next;

    }

    printf(" ");

}

void FreeList(LinkList *L)

{

    LNode *p, *tmp;

    p = *L;

   

   

    while (p != NULL)

    {

        tmp = p;

        p = p->next;

        free(tmp);

    }

    *L = NULL;

    tmp = NULL;

}

void CreateList_H(LinkList *L, int n) // 指向指针的指针

{

    *L = (LNode*)malloc(sizeof(LNode));

    if (*L == NULL)

    {

        printf("内存分配失败 ");

        exit(1);

    }

    (*L)->next = NULL;

    LNode* p;

    for (int i = 1; i <= n; i++)

    {

        p = (LNode*)malloc(sizeof(LNode));

        if (p == NULL)

        {

            printf("内存分配失败 ");

            exit(1);

        }

        printf("请输入第%d个结点的值:", i);

        scanf("%d", &p->data);

        p->next = (*L)->next;

        (*L)->next = p;

    }

}

void CreateList_R(LinkList *L, int n)

{

    *L = (LNode*)malloc(sizeof(LNode));

    if (*L == NULL)

    {

        printf("内存分配失败 ");

        exit(1);

    }

    (*L)->next = NULL;

    LNode *r, *p;

    r = *L;

    for (int i = 1; i <= n; i++)

    {

        p = (LNode*)malloc(sizeof(LNode));

        if (p == NULL)

        {

            printf("内存分配失败 ");

            exit(1);

        }

        printf("请输入第%d个结点的值:", i);

        scanf("%d", &p->data);

        p->next = NULL;

        r->next = p;

        r = p;

    }

}

void ReverseList(LinkList L)

{

    LNode *cur, *pre, *tmp;

    cur = NULL;

    pre = L->next;

    while (pre)

    {

        tmp = pre->next;

        pre->next = cur;

        cur = pre;

        pre = tmp;

    }

    L->next = cur;

}

int GetElem(LinkList L, int i, int* e)

{

    LNode *p;

    p = L->next;

    int j = 1;

   

    while (p && j < i)

    {

        p = p->next;

        j++;

    }

    if (p == NULL || j > i)

    {

        return 1;

    }

    *e = p->data;

    return 0;

}

int ListInsert(LinkList *L, int i, int e)

{ // 在带头结点的单链表 L 中第 i 个位置插入值为 e 的新结点

    LNode* p = *L;

    int j = 0;

    while (p && (j < i - 1)) // 查找第 i - 1 个结点,p 指向该结点

    {

        p = p->next;

        j++;

    }

    if (p == NULL || j > i - 1) return 1;

    LNode* s;

    s = (LNode*)malloc(sizeof(LNode));

    s->data = e;

    s->next = p->next;

    p->next = s;

    return 0;

}

int ListDelete(LinkList* L, int i)

{ // 在带头结点的单链表 L 中,删除第 i 个元素

    LNode* p;

    p = *L;

    int j = 0;

    while (p->next && (j < i - 1)) // 查找第 i - 1 个结点,p 指向该结点

    {

        p = p->next; j++;

    }

    if (!p->next || (j > i - 1)) return 1;

    LNode* q;

    q = p->next;

    p->next = q->next;

    free(q);

    return 0;

}

到此这篇单向链表结构图(单向链表有什么特征)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 跳转链接制作软件(跳转链接怎么制作)2025-04-24 18:36:08
  • 游戏代码网站链接(游戏网址代码)2025-04-24 18:36:08
  • 单向链表和双向链表区别(单链表和双向链表的区别)2025-04-24 18:36:08
  • b站上的视频链接怎么打开(b站上的视频链接怎么打开的)2025-04-24 18:36:08
  • mouse2joystick下载(mouse2joystick下载链接)2025-04-24 18:36:08
  • 单向链表 反转(单向链表反转的时间复杂度是)2025-04-24 18:36:08
  • 单向链表(单向链表和双向链表区别)2025-04-24 18:36:08
  • 单向链表和双向链表区别(双向链表比单向链表的优点)2025-04-24 18:36:08
  • b站怎么在视频里放链接(b站上的视频链接怎么打开)2025-04-24 18:36:08
  • 单向链表和双向链表适用什么场合(单向链表和双向链表适用什么场合存储)2025-04-24 18:36:08
  • 全屏图片