20.5.9(C语言)链表创建,输出,结点地址取值,值取结点地址,插入新值,删除值

//(C语言)链表创建,输出,结点地址取值,值取结点地址,插入新值,删除值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define error 0

typedef struct Node

{

    int data;

    struct Node *next;

} LNode, *LinkList;

LinkList CreateList_R(LNode *L, int n)

{

    int i;

    LNode *p, *r;

    L->next = NULL; //建立一个带头结点的空链表

    r = L;          //尾指针r指向头结点

    for (i = 0; i < n; i++)

    {

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

        printf("请输入第%d个数", i + 1);

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

        p->next = NULL; //建立一个带头结点的空链表

        r->next = p;

        r = p;

    }

    r->next = L;

    return L;

}

void print(LNode *L)

{

    LNode *r;

    r = L;

    while (r->next != L) //r所指节点不能为空

    {

        r = r->next;            //r后移指向下一个节点

        printf("%d ", r->data); //输出r所指的节点的值

    }

    printf("\n");

}

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

{

    int j = 1;

    LNode *p;

    p = L->next;

    while (p->next != L && j < i)

    {

        p = p->next;

        j++;

    }

    if (!p || j > i)

    {

        printf("error");

        return error;

    }

    e = p->data;

    printf("输出要找的数第%d个数:%d\n", i, e);

    return 0;

}

LinkList LocateElem(LNode *L, int e)

{

    LNode *p;

    int i = 1;

    p = L->next;

    while (p && p->data != e)

    {

        p = p->next;

        i++;

    }

    printf("要查找的数据的结点地址为:%d\n", i);

    return p;

}

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

{

    LNode *p;

    int j = 0;

    p = L;

    while (p && (j < i - 1))

    {

        p = p->next;

        j++;

    }

    if (!p || j > i - 1)

    {

        return error;

    }

    LNode *s;

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

    s->data = e;

    s->next = p->next;

    p->next = s;

    printf("输出插入数后的新链表:");

    LNode *r;

    r = L;

    while (r->next != L) //r所指节点不能为空

    {

        r = r->next;            //r后移指向下一个节点

        printf("%d ", r->data); //输出r所指的节点的值

    }

    printf("\n");

    return 0;

}

LinkList ListDelete(LNode *L, int i)

{

    LNode *p, *q;

    p = L;

    int j = 0;

    while ((p->next) && (j < i - 1))

    {

        p = p->next;

        j++;

    }

    q = p->next;

    p->next = q->next;

    free(q);

    printf("输出删除数后的新链表:");

    LNode *r;

    r = L;

    while (r->next != L) //r所指节点不能为空

    {

        r = r->next;            //r后移指向下一个节点

        printf("%d ", r->data); //输出r所指的节点的值

    }

    printf("\n");

    return 0;

}

int main()

{

    LNode *A;

    int length_A, i, e;

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

    printf("请输入需要输入的数据个数:");

    scanf("%d", &length_A);

    CreateList_R(A, length_A);

    printf("输出刚才输入的数据:");

    print(A);

    printf("请输入需要取的数据序号:");

    scanf("%d", &i);

    GetElem(A, i, e);

    printf("请输入需要取的数据值:");

    scanf("%d", &e);

    LocateElem(A, e);

    printf("输入需要插入的数据的位置和值(空格隔开):");

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

    ListInsert(A, i, e);

    printf("输入需要删除的数据的位置:");

    scanf("%d", &i);

    ListDelete(A, i);

    return 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

友情链接更多精彩内容