LINKLIST

单链表

typedef int Elemtype;

typedef struct LinkNode{
    Elemtype data;
    struct LinkNode * next;
}LinkNode,*LinkList;

头指针和头节点

skip

头插法

#include <iostream>

typedef int Elemtype;

typedef struct LinkNode {
    Elemtype data;
    struct LinkNode* next;
} LinkNode, *LinkList;

void insert(LinkList L, int enterList[], int listLength) {
    int i = 0;
    while (i < listLength) {
        LinkNode* pNode = (LinkNode*)malloc(sizeof(LinkNode));
        pNode->data = enterList[i];
        // 插入一个数据结点时,将插入节点的指针改成插入位置的后继
        pNode->next = L->next;
        L->next = pNode;
        i++;
    }
}

LinkNode* create(int enterList[], int listLength) {
    LinkNode* L = NULL;
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL; // 创建了一个只带头节点的空链表
    insert(L, enterList, listLength);
    return L; // 返回头结点的地址,等于返回了整个链表的信息
}

int main() {
    int enterList[] = {1, 2, 3, 4, 5};
    int listLength = sizeof(enterList) / sizeof(enterList[0]);

    LinkNode* L = create(enterList, listLength);
    
    // 遍历链表并输出元素
    std::cout << "链表元素: ";
    LinkNode* current = L->next; // 跳过头节点
    while (current != NULL) {
        std::cout << current->data << " ";
        current = current->next;
    }
    
    // 释放链表的内存
    while (current) {
        LinkNode* temp = current;
        current = current->next;
        free(temp);
    }
    free(L);
    
    return 0;
}

尾插法

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

typedef int Elemtype;

typedef struct LinkNode {
    Elemtype data;
    struct LinkNode* next;
} LinkNode, *LinkList;

void create(LinkList &L, int enterList[], int length) {
    L = (LinkNode *) malloc(sizeof(LinkNode));
    L->next = NULL;
    LinkNode *pTail = L;
    int i = 0;
    while (i < length) {
        LinkNode *pNode = (LinkNode *) malloc(sizeof(LinkNode));
        pNode->data = enterList[i];
        pNode->next = pTail->next; // 先将插入结点指针域修改为pTail的后继
        pTail->next = pNode; // 尾结点pTail的后继更新为pNode
        pTail = pNode; // 此时pnode为最后一个结点,更新ptail指针,使其指向新的尾结点
        ++i;
    }
}

void printLinkList(LinkList L) {
    LinkNode *pNode = L->next;
    while (NULL != pNode) {
        printf("%d ", pNode->data);
        pNode = pNode->next;
    }
    printf("\n");
}

int main() {
    LinkList myList;
    int data[] = {1, 2, 3, 4, 5};
    int length = sizeof(data) / sizeof(data[0]);

    create(myList, data, length);

    printf("Created Linked List: ");
    printLinkList(myList);

    return 0;
}

单链表递归

#include <stdio.h>
#include <stdlib.h>
#include <limits.h> // 为了使用INT_MIN常量

typedef int Elemtype;

typedef struct LinkNode {
    Elemtype data;
    struct LinkNode* next;
} LinkNode, *LinkList;

// getMax函数的定义
int getMax(LinkNode *pCur) {
    if (NULL == pCur) {
        return INT_MIN; // 使用INT_MIN来表示负无穷
    }
    int temp = getMax(pCur->next);
    return temp > pCur->data ? temp : pCur->data;
}

// getNodesNum函数的定义
int getNodesNum(LinkNode *pCur) {
    if (NULL == pCur) {
        return 0;
    }
    return 1 + getNodesNum(pCur->next);
}

// getAvg函数的定义,接受节点数量作为参数
double getAvg(LinkNode *pCur, int num) {
    if (NULL == pCur || num == 0) {
        return 0.0; // 如果链表为空或者节点数量为0,返回0.0
    }
    return (double)pCur->data / num + getAvg(pCur->next, num);
}

// 创建链表函数
LinkList createLinkedList(int data[], int length) {
    LinkList myList = (LinkNode *)malloc(sizeof(LinkNode));
    myList->next = NULL;
    LinkNode *pTail = myList;
    
    for (int i = 0; i < length; ++i) {
        LinkNode *pNode = (LinkNode *)malloc(sizeof(LinkNode));
        pNode->data = data[i];
        pNode->next = pTail->next;
        pTail->next = pNode;
        pTail = pNode;
    }
    
    return myList;
}

// 释放链表内存
void freeLinkedList(LinkList myList) {
    LinkNode *pNode = myList;
    while (pNode != NULL) {
        LinkNode *temp = pNode;
        pNode = pNode->next;
        free(temp);
    }
}

int main() {
    int data[] = {1, 2, 3, 4, 5};
    int length = sizeof(data) / sizeof(data[0]);

    // 创建链表
    LinkList myList = createLinkedList(data, length);

    // 计算链表中的最大值
    int max = getMax(myList->next);
    printf("链表中的最大值: %d\n", max);

    // 计算链表中的节点数量
    int nodeCount = getNodesNum(myList->next);
    printf("链表中的节点数量: %d\n", nodeCount);

    // 计算链表中节点数据的平均值
    double avg = getAvg(myList->next, nodeCount);
    printf("链表中节点数据的平均值: %lf\n", avg);

    // 释放链表内存
    freeLinkedList(myList);

    return 0;
}

返回第i个元素

【test】

typedef int Elemtype;
typedef struct LinkNode {
    Elemtype data;
    struct LinkNode* next;
} LinkNode, *LinkList;

void getIth(LinkList L,int ith,Elemtype e){
    int count = 0;
    LinkNode * pCur = L->next;//从第一个数据节点开始访问
    while(pCur !=NULL){
        count+=1;
        if(count==ith){
            return pCur;
        }
        pCur=pCur->next;
    }
    return NULL;
    
}


int main(){
    int enterList[] = {1,2,3,4,5};
    int listLength = 5;
    LinkList L =create(enterList,listLength);
    LinkNode*pNode = getIth(L,3);
    if(pNode!=NULL){
        printf("%d\n",pNode->data);
    }
    print(L);


}

第i个结点前插入

typedef int Elemtype;
typedef struct LinkNode {
    Elemtype data;
    struct LinkNode* next;
} LinkNode, *LinkList;

void insertIth(LinkList L,int ith,Elemtype e){
    int count = 0;
    LinkNode * preCur = L;//第一个数据节点的前驱
    LinkNode * pCur = L->next;//从第一个数据节点开始访问
    while(pCur !=NULL){
        count+=1;
        if(count==ith){
            LinkNode * pNode = (LinkNode *)malloc(sizeof(LinkNode));
            pNode->data = e;
            pNode->next = preCur->next;
            preCur->next = pNode;
            break;
        }
        preCur= pCur;
        pCur = pCur->next;
    }
    return NULL;
    
}


int main(){
    int enterList[] = {1,2,3,4,5};
    int listLength = 5;
    LinkList L =create(enterList,listLength);
    print(L);
    insertIth(L,3,8);
    print(L);


}

查找倒数第m个节点

typedef int Elemtype;
typedef struct LinkNode {
    Elemtype data;
    struct LinkNode* next;
} LinkNode, *LinkList;

void getData(int m,LinkList L){
    //访问链表第m+1个节点
    LinkList pCur = L->next;
    int count = 0;
    while(pCur != NULL){
        ++count;
        if(count==m+1){
            break;
        }
        pCur= pCur->next;
    }
    //两指针同时移动查找相对位置的节点
    LinkNode* pNode = L->next;
    while(pCur!=NULL){
        pNode= pNode->next;
        pCur= pCur->next;
    }
    printf("%d",pNode->data);

}



查找第j+len个结点

LinkNode* getPre(int ith,LinkList L){
    LinkNode* preCur = L;
    LinkNode pCur = L->next;
    int count = 0;
    while(pCur!=NULL){
        ++count;
        if(count==ith){
            return preCur;
        }
        preCur= pCur;
        pCur=pCur->next;
    }

}


void oper(LinkList &La,LinkList &Lb,int j,int len){
    LinkNode* pLa = (LinkNode*)malloc(sizeof(LinkNode));
    pLa->next = La;
    La = pLa;

    LinkNode* pLb = (LinkNode*)malloc(sizeof(LinkNode));
    pLb->next = Lb;
    Lb = pLb;
    LinkNode* preJthLa = getPre(j,La);
    LinkNode* preJLenLa = getPre(j+len-1,La);
    LinkNode* preJthLb = getPre(j,Lb);

    LinkNode* pNode = preJLenLa->next->next;

    preJLenLa->next->next= preJLenLb->next;
    preJthLb->next = preJthLa ->next;
    preJLenLa->next= pNode;

    print(La);
    print(Lb);


}

前一半,后一半

int isSym(LinkList L,int n){
    LinkNode* pCur = L->next;
    int count= 0;
    while(pCur!=NULL){
        ++count;
        if(n/2==count){
            break;
        }
        pCur = pcur->next;
    }
    LinkNode* pLast= NULL;

    if(n%2!=0){
        pLast =pCur->next->next;
    }
    else{
        pLast =pCur->next;
    }
    pCur=L->next;
    while(pLast!=NULL){
        if(pCur->data != pLast->data){
            return 0;
        }
        pCur=pCur->next;
        pLast= pLast->next;
    }
    return 1;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值