02-单链表的操作

单链表的创建:头插法

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>



typedef int ElemType;
/*定义一个单链表*/
typedef struct LNode{
    ElemType data;
    /*下一个元素的地址指针*/
    struct LNode *next;
} LNode,*LinkList;

/**
 *单链表的创建
 * @return
 */
LinkList CreateListByHead(LinkList L){
    /*中间指针 */
    LNode  *s;
    /*存入的元素*/
    int x;
    /*创建头节点:申请空间*/
    L=(LinkList) malloc(sizeof (LNode));
    /*对头结点进行初始化:*/
    L->next=NULL;
    /*读取传入的元素*/
    scanf("&d",&x);
    while (x !=999){
        /*创建新的节点*/
        s = (LinkList) malloc(sizeof(LNode));
        s->data=x;
        /*中间指针存储的地址为:头指针的地址*/
        s->next = L->next;
        /*重新设置 头结点存储的指针:为插入元素的地址*/
        L->next=s;
        scanf("%d",&x);
    }
    /*返回头节点*/
    return  L;
}



int main()
{

    LinkList L;
    CreateListByHead(L);

    return 0;
}


单链表的创建:尾插法

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>


typedef int ElemType;
/*定义一个单链表*/
typedef struct LNode{
    ElemType data;
    /*下一个元素的地址指针*/
    struct LNode *next;
} LNode,*LinkList;

/**
 *单链表的创建: 使用尾插法
 * @return
 */
LinkList CreateListByTail(LinkList L){
    /*中间指针 */
    LNode  *s;
    /*存入的元素*/
    int x;
    /*创建头结点:申请空间*/
    L=(LinkList) malloc(sizeof (LNode));
    L->next=NULL;
    //初始化:只有一个头结点=尾节点
    LNode *r=L;

    /*读取传入的元素*/
    scanf("&d",&x);
    while (x !=999){
        /*创建新的节点*/
        s = (LinkList) malloc(sizeof(LNode));
        s->data=x;
        /*更新当前r指针上的元素 存储的下一个地址指针*/
        r->next=s;
        /*更新尾节点的元素地址:为新插入的元素地址*/
        r=s;
        scanf("%d",&x);
    }
    /*插入完成:尾巴置空*/
    r->next=NULL;
    /*返回头结点*/
    return  L;


}




int main()
{

    LinkList L;
    CreateListByTail(L);

    return 0;
}


单链表的查找

/* 按位查找,返回第i个位置的节点指针 */
LNode* getElemByPos(LinkList L, int i) {
    int j = 0;
    LNode *p = L;
    while (p != NULL && j < i) {
        p = p->next;
        j++;
    }
    return p;
}

单链表的插入节点

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int ElemType;

/* 定义一个单链表 */
typedef struct LNode{
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

/* 获取链表长度 */
int length(LinkList L) {
    int len = 0;
    LNode *p = L->next; // 假设L是一个头节点
    while (p != NULL) {
        len++;
        p = p->next;
    }
    return len;
}

/* 按位查找,返回第i个位置的节点指针 */
LNode* getElemByPos(LinkList L, int i) {
    int j = 0;
    LNode *p = L;
    while (p != NULL && j < i) {
        p = p->next;
        j++;
    }
    return p;
}

/**
 * 在L的第i个位置上插入元素值为x的节点
 * @param L 链表
 * @param i 位序
 * @param x 节点上的值
 */
void insertNode(LinkList L, int i, ElemType x) {
    if (i < 1 || i > length(L) + 1) {
        printf("无效的位置\n");
        return;
    }
    LNode *s = (LinkList) malloc(sizeof(LNode));
    s->data = x;
    LNode *p = getElemByPos(L, i - 1); // 获取第(i-1)个节点
    /* 在p之后插入s */
    s->next = p->next;
    p->next = s;
}

int main() {
    /* 初始化链表L为一个带头节点的空链表 */
    LinkList L = (LinkList) malloc(sizeof(LNode));
    L->next = NULL;

    /* 插入测试数据 */
    insertNode(L, 1, 10); // 在第1个位置插入10
    insertNode(L, 2, 20); // 在第2个位置插入20
    insertNode(L, 1, 5);  // 在第1个位置插入5

    /* 打印链表 */
    LNode *p = L->next;
    while (p != NULL) {
        printf("%d -> ", p->data);
        p = p->next;
    }
    printf("NULL\n");

    /* 释放链表 */
    p = L;
    while (p != NULL) {
        LNode *temp = p;
        p = p->next;
        free(temp);
    }

    return 0;
}

单链表的删除节点

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int ElemType;

/* 定义一个单链表 */
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

/* 获取链表长度 */
int length(LinkList L) {
    int len = 0;
    LNode *p = L->next; // 假设L是一个头节点
    while (p != NULL) {
        len++;
        p = p->next;
    }
    return len;
}

/* 按位查找,返回第i个位置的节点指针 */
LNode* getElemByPos(LinkList L, int i) {
    int j = 0;
    LNode *p = L;
    while (p != NULL && j < i) {
        p = p->next;
        j++;
    }
    return p;
}

/* 删除指定位置的节点 */
bool deleteNode(LinkList L, int i, ElemType *e) {
    if (i < 1 || i > length(L)) {
        return false;
    }
    /* 被删除节点的前驱节点 */
    LNode *p;
    /* 辅助指针 */
    LNode *q;

    p = getElemByPos(L, i - 1);
    /* 删除p的后继节点 */
    q = p->next;
    p->next = q->next;
    /* 把值交给e */
    *e = q->data;
    /* 释放需要删除的节点 */
    free(q);
    return true;
}

/* 插入节点 */
void insertNode(LinkList L, int i, ElemType x) {
    if (i < 1 || i > length(L) + 1) {
        printf("无效的位置\n");
        return;
    }
    LNode *s = (LinkList) malloc(sizeof(LNode));
    s->data = x;
    LNode *p = getElemByPos(L, i - 1); // 获取第(i-1)个节点
    /* 在p之后插入s */
    s->next = p->next;
    p->next = s;
}

int main() {
    /* 初始化链表L为一个带头节点的空链表 */
    LinkList L = (LinkList) malloc(sizeof(LNode));
    L->next = NULL;

    /* 插入测试数据 */
    insertNode(L, 1, 10); // 在第1个位置插入10
    insertNode(L, 2, 20); // 在第2个位置插入20
    insertNode(L, 1, 5);  // 在第1个位置插入5

    /* 打印链表 */
    LNode *p = L->next;
    while (p != NULL) {
        printf("%d -> ", p->data);
        p = p->next;
    }
    printf("NULL\n");

    /* 删除节点测试 */
    ElemType e;
    if (deleteNode(L, 2, &e)) {
        printf("已删除节点的值: %d\n", e);
    } else {
        printf("删除失败\n");
    }

    /* 再次打印链表 */
    p = L->next;
    while (p != NULL) {
        printf("%d -> ", p->data);
        p = p->next;
    }
    printf("NULL\n");

    /* 释放链表 */
    p = L;
    while (p != NULL) {
        LNode *temp = p;
        p = p->next;
        free(temp);
    }

    return 0;
}

posted @ 2024-06-30 00:14  成强  阅读(7)  评论(0编辑  收藏  举报