6-C/C++实现数据结构链表相关操作

c/c++ 数据结构-线性表(单链表基本操作的实现) 线性表–链式存储结构 单链表基本操作的实现 阅读详情

本文代码分别包括:

头文件、创建链表等

1创建链表

第8题验证是否有环的创建链表

2遍历链表函数

3删除链表结点函数

4-1倒置链表函数-方法一改变指针指向

4-2倒置链表函数-方法二改变结点位置(头插法,断一个接一个)

5删除倒数第n个结点-快慢指针法

6合并两个有序链表

7两数相加

8判断链表中是否有环

*9求环的入口(较难,考试可能性小)

*10求环的长度

*11约瑟夫环-不包含头结点的环删除指定序列结点后相连

主函数


PART 1(自己写的):

准备代码

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

using namespace std;

typedef struct ListNode{
    int data;
    struct ListNode *next;
}ListNode;

1创建链表

//1创建链表
ListNode *CreatList(){
    ListNode *H,*M,*N;                              //定义头结点指针H、向下链接结点指针M、新创建结点指针N
    int n,c;                                          //n为创建链表结点的个数,c为结点data值
    H = (ListNode *)malloc(sizeof(ListNode));       //分配一块LinkNode类型的内存空间做头结点
    H->next = NULL;                                 //头结点指针域指向空
    M = H;                                          //M先指向头结点

    printf("please input the number of nodes:");
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        N = (ListNode *)malloc(sizeof(ListNode));   //新创建子结点
        printf("please input %dth data:",i);
        scanf("%d",&c);                             //新创建结点data值
        N->data = c;
        M->next = N;                                //通过M指针将新结点链接进单链表
        M = N;                                      //M指向最后一个结点
    }
    M->next = NULL;
    printf("\n");
    return H;
}

第8题验证是否有环的创建链表

//第8题验证是否有环的创建链表
ListNode *CreatList2(){
    ListNode *H,*M,*N;
    int n,c;
    H = (ListNode *)malloc(sizeof(ListNode));
    H->next = NULL;
    M = H;

    printf("please input the number of nodes:");
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        N = (ListNode *)malloc(sizeof(ListNode));
        printf("please input %dth data:",i);
        scanf("%d",&c);
        N->data = c;
        M->next = N;
        M = N;
    }
    M->next = H->next->next;
    printf("\n");
    return H;
}

2遍历链表函数

//2遍历链表函数
void TraverseList(ListNode *pHead){
    ListNode *p = pHead->next;
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

3删除链表结点函数

//3删除链表结点函数
void Del_Node(ListNode *pHead,int n){
    ListNode *p = pHead;                        //定义p指向头结点
    ListNode *q = pHead->next;                  //定义q总指向p的下一个结点,q指向待删除元素
    int i = 1;
    while((q != NULL) && (n>=1) && (i<=n-1))    //循环终止条件为第n-1个元素已经是最后一个元素或者n小于1或者已经查找到索删位置
    {
        p = p->next;
        q = q->next;
        i++;
    }
    if(q == NULL)
        p->next = NULL;
    else{
        p->next = q->next;
        free(q);
    }
}

4-1倒置链表函数-方法一改变指针指向

//4-1倒置链表函数-方法一改变指针指向
ListNode *ReverseList(ListNode *pHead){
    ListNode *p,*q,*r;                  //定义三个指针依次指向头结点后三个结点
    p = pHead->next;
    q = p->next;
    r = q->next;

    if(p == NULL || q == NULL)            //如果不存在结点或者只有一个结点,则不发生交换
        return NULL;
    while(r != NULL)                    //如果最后一个结点指向NULL,则不再需要向后移动指针
    {
        q->next = p;
        p = q;
        q = r;
        r = r->next;
    }
    q->next = p;                        //对最后两个结点进行倒叙
    pHead->next->next = NULL;           //将第一个结点指向NULL
    pHead->next = q;                    //用头结点连接链表第最后一个结点,完成倒叙
}

4-2倒置链表函数-方法二改变结点位置(头插法,断一个接一个)

//4-2倒置链表函数-方法二改变结点位置(头插法,断一个接一个)
ListNode *ReverseList2(ListNode * pHead){
    ListNode *p,*q;
    p = pHead->next;
    q = p->next;

    while(p != NULL && q != NULL)       //如果为空链表或者q指向空,表示无结点调整不再执行循环,注意此处为!=所以要用&&
    {
        p->next = q->next;              //将q结点摘出来插在头结点后
        q->next = pHead->next;
        pHead->next = q;
        q = p->next;                    //更新指针,使得q总指向要调整的结点,而p指针一直指向最小值
    }
    return pHead;
}

5删除倒数第n个结点-快慢指针法

//5删除倒数第n个结点-快慢指针法
ListNode *Del_FromEnd(ListNode *pHead,int n){
    ListNode *slow,*fast;
    slow = pHead;
    fast = pHead;

    if(n<1)                          //输入不合法返回
    {
        printf("wrong,can't do it!\n");
        return NULL;
    }
    while(fast->next != NULL && n)   //此处限制的无法删除头结点
    {
        fast = fast->next;
        n--;
    }
    while(fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next;
    }
    fast = slow->next;                  //复用fast指针指向删除的结点用于free
    slow->next = slow->next->next;
    free(fast);
    return pHead;
}

6合并两个有序链表

//6合并两个有序链表
ListNode *MergeOderList(ListNode *pHead1,ListNode *pHead2){
    ListNode *nHead = NULL;                                         //定义一个新的头结点
    ListNode *pMove = NULL;                                         //定义一个新的遍历指针
    if(pHead1->next == NULL) return pHead2;                         //如果有一个链表为空则返回另一个链表头
    else if(pHead2->next == NULL) return pHead1;

    if((pHead1->next->data) <= (pHead2->next->data))                //将第一个结点链入新链表的头结点
        nHead = pHead1;
    else
        nHead = pHead2;

    pHead1 = pHead1->next;                                          //从第一个结点开始
    pHead2 = pHead2->next;
    pMove = nHead;

    while((pHead1 != NULL) && (pHead2 != NULL))                     //循环对比数据域的值,用pMove指针连接
    {
        if((pHead1->data) <= (pHead2->data))
        {
            pMove->next = pHead1;
            pMove = pHead1;
            pHead1 = pHead1->next;
        }
        else
        {
            pMove->next = pHead2;
            pMove = pHead2;
            pHead2 = pHead2->next;
        }
    }

    if(pHead1 == NULL)                                              //最后一个结点链入
        pMove->next = pHead2;
    else if(pHead2 == NULL)
        pMove->next = pHead1;
    return nHead;
}

 


7两数相加

//7两数相加
ListNode *NumberAdd(ListNode *pHead1,ListNode *pHead2){
    ListNode *nHead = (ListNode *)malloc(sizeof(ListNode));     //创建头结点
    nHead->next = NULL;
    ListNode *pMove = nHead;                                    //设立一个移动指针用于链接后方结点
    int symbol = 0;                                             //进位标志
    pHead1 = pHead1->next;                                      //两个相加链表从第一个结点开始
    pHead2 = pHead2->next;

    while((pHead1 != NULL) || (pHead2 != NULL))                 //循环终止条件
    {
        int x = (pHead1 != NULL)? pHead1->data:0;               //长度不一致时将先为NULL的置为0以相加时可以得到数值
        int y = (pHead2 != NULL)? pHead2->data:0;
        int sum = x + y + symbol;


        ListNode *p = (ListNode *)malloc(sizeof(ListNode));     //创建结点

        if(sum>=10)
        {
            p->data = sum % 10;
            symbol = 1;
        }
        else
            {
                p->data = sum;
                symbol = 0;
            }
        pMove->next = p;                                        //使用pMove指针将每次新创建的结点p链进链表
        pMove = p;
        if(pHead1 != NULL) pHead1 = pHead1->next;               //两个链表向下遍历
        if(pHead2 != NULL) pHead2 = pHead2->next;
    }
    pMove->next = NULL;

    if(symbol>0)                                                //如果最后一位相加后有进位,需要单独再创建一个结点保存进位值
    {
        ListNode *p = (ListNode *)malloc(sizeof(ListNode));
        p->data = symbol;
        pMove->next = p;
        p->next = NULL;
    }
    return nHead;
}

8判断链表中是否有环

//8判断链表中是否有环
void IfCircle(ListNode *pHead){
    ListNode *slow = pHead,*fast = pHead;       //设置快慢指针,慢指针每次走1步,快指针每次走2步
    if(pHead->next == NULL)
        printf("NO NODE!!");
    while(fast != NULL && fast->next != NULL){
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
        {
            printf("I HAVE A CIRCLE!!\n");
            break;
        }
    }
}

*9求环的入口(较难,考试可能性小)

//*9求环的入口(较难,考试可能性小)
ListNode *CircleEntrance(ListNode *pHead){
    ListNode *slow = pHead,*fast = pHead,*Len = pHead;       //设置快慢指针,慢指针每次走1步,快指针每次走2步,再设置一个指针用于遍历头结点到入口距离
    int cot = 0;                                             //cot用来统计环入口距离头结点距离
    if(pHead->next == NULL)
        printf("NO NODE!!");

    while(fast != NULL && fast->next !=NULL)                //注意链表为奇数偶数时fast移动后指向的位置
    {
        slow = slow->next;
        fast = fast->next->next;
        /*分析:设头结点到环入口距离为a,环长为r,slow和fast相遇时slow在环中走过的距离为x。可得相遇时慢指针走过的长度为a+x,
        快指针走过的距离为(a+x+r),由于fast=2倍slow,可得a=r-x,而r-x也等于slow距离环入口的长度*/
        if(slow == fast)
        {
            printf("I HAVE A CIRCLE!\n");
            while(Len != slow)              //见分析,slow与fast相遇点到环入口的距离等于头结点到环入口的距离
            {
                Len = Len->next;
                slow = slow->next;
                cot++;
            }
            printf("The Circle Entrance is %dth Node!\n",cot);
            return Len;
        }
    }
    if(fast == NULL || fast->next == NULL)
        return NULL;
}

*10求环的长度

//*10求环的长度
int CircleLength(ListNode *pHead){
    ListNode *Head;
    ListNode *a = CircleEntrance(Head);
    ListNode *b = a->next;                  //b为环入口的下一位,用户验证走完一圈因为下面循环判断的时候不能相等,所以这里错一位
    int cot = 1;                                //cot用来统计环长

    if(a == NULL)
        return 0;

    while(b != a)                           //b=a时即为环长
    {
        b=b->next;
        cot++;
    }
    printf("Circle Length is %d\n",cot);
    return cot;
}

*11约瑟夫环-不包含头结点的环删除指定序列结点后相连

//*11约瑟夫环-不包含头结点的环删除指定序列结点后相连
void JosphCircle(ListNode *pHead,int n){
    ListNode *p = pHead->next;              //p指向第一个结点
    ListNode *Del = NULL;                   //删除结点指针
    int cot=0;                              //cot为统计环长
    while(pHead->next != NULL)
        {
            pHead = pHead->next;
            cot++;
        }
    pHead->next = p;                        //将链表变成环
    if(n>=cot) printf("Bad Man!!");         //删除序列大于环长则不存在约瑟夫环
    while(p->next != p)
    {
        for(int i=1;i<=n;i++)
            p = p->next;
        Del = p->next;
        printf("DELE Node Number is %d\n",Del);
        p->next = Del->next;
        free(Del);
        /*此方法不对的原因是删除的是不是p本身而是下一个元素?
        p->data = p->next->data;
        Del = p->next;
        p->next = Del->next;
        free(Del);*/
    }
}

主函数

int main()
{
    ListNode *chain,*chain1,*chain2;
    chain = CreatList();
    //Del_Node(chain,4);
    //ReverseList2(chain);
    //Del_FromEnd(chain,5);
    //chain1 = CreatList();
    //chain2 = CreatList();
    //chain = MergeOderList(chain1,chain2);
    //chain = NumberAdd(chain1,chain2);
    JosphCircle(chain,2);
    TraverseList(chain);
    //chain = CreatList2();
    //IfCircle(chain);
    //CircleEntrance(chain);
    //CircleLength(chain);

    return 0;
}

PART 2(西交无尽):

#include<stdio.h>
#include<stdlib.h>
#define null NULL
//Definition of ListNode
typedef struct list_node
{
	int data ; //数据域,用于存储数据
	struct list_node *next ; //指针,可以用来访问节点数据,也可以遍历,指向下一个节点
}ListNode;


//尾插法创建链表
ListNode *CreateList(int n)
{
    ListNode *head;
    ListNode *p,*pre;
    int i;
    head=(ListNode *)malloc(sizeof(ListNode));
    head->next=NULL;
    pre=head;
    for(i=1; i<=n; i++)
    {
        printf("input name of the %d data:",i);
        p=(ListNode *)malloc(sizeof(ListNode));

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

        pre=p;
    }
    p->next = NULL;
    //p->next=head->next->next;
    return head;
}

//遍历链表函数
void TraverseList(ListNode *pHead)
{
    ListNode *p = pHead->next; //将头节点的指针给予临时节点p
    while(p != NULL)           //节点p不为空,循环
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
    return ;
}


//删除链表节点函数
int Del_Node(ListNode *pHead,int back)
{
    int i = 0;
    int data;
    ListNode *_node = pHead;
    ListNode *pSwap;
    if ((back < 1) && (NULL == _node->next))
    {
        printf("删除失败!\n");
        return 0;
    }
    while(i < back-1)
    {
        _node = _node->next;
        ++i;
    }
    pSwap = _node->next;
    data = pSwap->data;
    _node->next = _node->next->next;
    free(pSwap);
    return data;
}


//倒置链表3
ListNode *node2(ListNode *pHead){
    pHead = pHead->next;
    ListNode *p = NULL;
    while(pHead){
        ListNode *nx = pHead->next;
        pHead->next = p;
        p = pHead;
        pHead = nx;
    }
    return p;
}


//倒置链表1
ListNode *node1(ListNode *pHead){
    ListNode *p = NULL;
    ListNode *q = NULL;
    ListNode *r = NULL;
    if(pHead->next == NULL){return NULL;}
    if(pHead->next->next == NULL){return pHead;}
    else if(pHead->next->next->next == null) {
    p = pHead->next;
    q = p->next;
    q->next = p;
    pHead->next = q;
    p->next = NULL;
    }
    else if(pHead->next->next->next != null){

    p = pHead->next;
    q = p->next;
    r = q->next;
    p->next = null;
    while(r != NULL){
    q->next = p;
    p = q;
    q = r;
    r = r->next;
    }
    q->next = p;
    pHead->next = q;
    }
    return pHead;

}


//倒置链表3
ListNode* ReverseList(ListNode* pHead)
{
    ListNode *q=pHead->next;
    ListNode *p=NULL;
    ListNode *r=NULL;
    if(pHead->next==NULL)
        return NULL;
    while(q->next)
    {
        r=q->next;
        q->next=p;
        p=q;
        q=r;
    }
    q->next=p;
    pHead->next = q;
    return pHead;
}


//删除倒数第N个节点
ListNode *removeNthFromEnd(ListNode *head, int n)
{
    // write your code here
    ListNode *fast = head;
    ListNode *low  = head;
    ListNode *pre = NULL;

    if(head == NULL  || n <= 0)
    {
        return NULL;   //输入的链表为空,或输入的n不合法;
    }

    for(int i = 0; i < n-1; i ++)
    {
        if(fast->next)
        {
            fast = fast->next;
        }

        else
        {
            return NULL;   //输入的n大于链表的长度;
        }

    }

    while(fast->next)
    {
        fast = fast->next;
        pre  = low;      //需要保存需要删除的那个结点的上一个结点。
        low  = low->next;
    }

    if(low == head)   //删除的那个结点是头结点。
    {
        head = head->next;
    }
    else
    {
        pre->next = pre->next->next;
    }

    return head;
}


//合并两个有序链表
ListNode *MergeTwoOrderedLists(ListNode *pHead1, ListNode *pHead2)
{
    ListNode *pTail = NULL;//指向新链表的最后一个结点 pTail->next去连接
    ListNode *newHead = NULL;//指向合并后链表第一个结点

    if (pHead1->next == NULL)
    {
        return pHead2;
    }
    else if(pHead2->next == NULL)
    {
        return pHead1;
    }
    else
    {
        //确定头指针
        if ( pHead1->next->data < pHead2->next->data)
        {
            newHead = pHead1;
        }
        else
        {
            newHead = pHead2;
        }
            pHead1 = pHead1->next;
            pHead2 = pHead2->next;
        pTail = newHead;    //指向第一个结点
        while ( pHead1 && pHead2)
        {
            if ( pHead1->data <= pHead2->data )
            {
                pTail->next = pHead1;
                pHead1 = pHead1->next;
            }
            else
            {
                pTail->next = pHead2;
                pHead2 = pHead2->next;
            }
            pTail = pTail->next;
        }

        if(pHead2 != NULL)
        {
            pTail->next = pHead2;
        }
        else if(pHead1 != NULL)
        {
            pTail->next = pHead1;
        }
        return newHead;
    }
}


//两数相加
ListNode *addTwoNumbers(ListNode *pHead1, ListNode *pHead2) {
    ListNode *L,*curr;
    L = (ListNode *)malloc(sizeof(ListNode));
    L->next = NULL;
    curr = L;
    ListNode *p = pHead1->next, *q = pHead2->next;
    int carry = 0;
    while (p != null || q != null) {
        int x = (p != null) ? p->data : 0;
        int y = (q != null) ? q->data : 0;
        int sum = carry + x + y;
        carry = sum / 10;
        ListNode *r = (ListNode *)malloc(sizeof(ListNode));
        r->data = sum%10;
        curr->next = r;
        curr = curr->next;
        if (p != null) p = p->next;
        if (q != null) q = q->next;
    }
        curr->next = NULL;
    if (carry > 0) {
        ListNode *r = (ListNode *)malloc(sizeof(ListNode));
        r->data = carry;
        curr->next = r;
        curr->next->next = NULL;
    }
    return L;
}

//检查环
int HasCircle(ListNode * pHead)
{
    ListNode * pFast = pHead; // 快指针每次前进两步
    ListNode * pSlow = pHead; // 慢指针每次前进一步
    while(pFast != NULL && pFast->next != NULL)
    {
        pFast = pFast->next->next;
        pSlow = pSlow->next;
        if(pSlow == pFast) // 相遇,存在环
            return 1;
    }
    return 0;
}

//找出环的入口
ListNode  *searchEntranceNode(ListNode *pHead)
{
    ListNode *pSlow=pHead;//p表示从头结点开始每次往后走一步的指针
    ListNode *pFast=pHead;//q表示从头结点开始每次往后走两步的指针
    while(pFast !=NULL && pFast->next !=NULL)
    {
        pSlow=pSlow->next;
        pFast=pFast->next->next;
        if(pSlow == pFast){
            break;//p与q相等,单链表有环
        }
    }
    if(pFast==NULL || pFast->next==NULL)
        return NULL;

    pSlow=pHead;
    while(pSlow != pFast)
    {
        pSlow=pSlow->next;
        pFast=pFast->next;
    }
    return pSlow;
}

//求环长
int circleLength(ListNode *pHead)
{
    ListNode *p=searchEntranceNode(pHead);//找到环的入口结点
    if(p==null)
        return 0;//不存在环时,返回0
    ListNode *q = p->next;
    int length=1;
    while(p != q)
    {
        length++;
        q=q->next;
    }
    return length;//返回环的长度
}

//约瑟夫环
void JosephProblem(ListNode *pHead,int m){
    ListNode *p = pHead->next;
    while(pHead->next != NULL) pHead = pHead->next;
    pHead->next = p;

    while(p->next != p){
        for(int i = 0;i<m-1;i++) p=p->next;

        //打印
        printf("%d ",p->next->data);

        ListNode *del = p->next;
        p->next = del->next;
        free(del);
        /*
        //特殊的删除方法
        p->data = p->next->data;
        ListNode *del = p->next;
        p->next = del->next;
        free(del);
        */
    }
}

int main()
{
    ListNode *chain,*nchain,*nnchain,*nnnchain = NULL;
    int n,back2;
    chain = CreateList(5);
    JosephProblem(chain,2);
    return 0;
}

(感谢西交无尽学长提供以上题目练习)

快慢指针参考:http://www.cnblogs.com/hxsyl/p/4395794.html

数据结构单链表基本操作(C/C++实现) 数据结构-单链表-基本操作(C/C++实现) 注意:本代码为了测试运行默认含有操作所需数据,如有需要可自己增删改相关数据 涉及基本运算 初始化单链表 依次采用尾插法插入元素 输出单链表 输出单链表的长度 判断单链表是否为空 输出单链表的第n个元素 输出元素x的位置 在第n个元素位置上插入x元素 输出单链表 删除单链表的第n个元素 输出单链表 释放单链表 GitHub地址(包含.cpp文件和可执... 阅读详情

相关推荐

C/C++线性表的基本操作(学生信息管理)(链表&顺序表)

定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; 顺序表:申请一个MAXSIZE=100大小的结构体数组,获取学生个数n,用一个for或者while循环逐个输入学生的各项基本信息,并存储到结构体中,且每次要记录插入的学生人数与和上一次操作的人数进行加和。 链表:获取学生个数n,每录入一个学生就动态申请一个学生信息结点,将其插...

Y_xy_9的博客 1万+

c++线性表实现(链式)

/*----------node.h----------------*/ templatetypename T> class Node { public: T data; Node *next; }; /*----------list.h----------------*/#include"node.h"#

m_qunqun的博客 878

数据结构循环单链表基本操作(C/C++实现)

数据结构循环单链表基本操作(C/C++实现) 注意:本代码为了测试运行默认含有操作所需数据,如有需要可自己增删改相关数据 涉及基本运算 初始化循环单链表 依次采用尾插法插入元素 输出循环单链表 输出循环单链表的长度 判空 判断循环单链表的第n个元素 输出元素x的位置 在第n个元素位置上插入f元素 输出循环单链表 删除循环单链表的第n个元素 输出循环单链表 释放循环单链表 GitHub地址(包含...

JunsIr的技术栈 2849

线性表的链式存储及其接口函数C++类实现

转载请注明出处:http://blog.youkuaiyun.com/hongkangwl/article/details/21883231 首先通过结构体建立每个节点 struct node //链表节点 { node* ptrnext; int data; }; 在线性表的类中,定义了一些对线性表的常用操作 class linklist //链表类 { pri...

互联网 298

数据结构双链表基本操作(C/C++实现)

数据结构双链表基本操作(C/C++实现) 注意:本代码为了测试运行默认含有操作所需数据,如有需要可自己增删改相关数据 涉及基本运算 初始化双链表 依次采用尾插法插入元素 输出双链表 输出双链表的长度 判断双链表是否为空 输出双链表的第n个元素 输出元素x的位置 在第n个元素位置上插入x元素 输出双链表 删除双链表的第n个元素 输出双链表 释放双链表 GitHub地址(包含.cpp文件和可执行程...

JunsIr的技术栈 1777

数据结构之双向循环链表(C++实现)

下午上机的时候大概地实现了链表的基本功能。写的时候也不是光是脑袋想, 就在word里面画了个粗糙的图形,边看边写。刚刚开始的时候功能可以不要 太多。把最基本的功能先实现,也就是数据定义,default constructor和destructor的功能 。然后测试,再增加功能,这样后来写的时候出错的时候就会很明朗,至少不会是前面写的 function出错了。g++和vc下调试通过。main

complety的专栏 1万+

链表逆序

设链表节点为view plaincopy to clipboardprint?typedef struct tagListNode{      int data;      struct tagListNode* next;  }ListNode, *List;  typedef struct tagListNode{ int data; struct tagListNode* next; }ListNode, *List;要求将一带链表头List head的单向链表逆序。分析:  1

yxh0823的专栏 865

C/C++用动态链表实现对学生信息的存储

/************************************************************************/ /* 此程序是运用动态内存分配的手段来实现用链表的方式存储学生相关信息的。 链表,是一种自定义数据类型。在使用结构体数组或结构体指针存储复杂数据类型 时需要较大的连续的内存空间,若无需要长度的连续空间会致使操作失败, 并且使用结构体数组或结构体指针时

九月飞雪的博客 5347

C语言数据结构 单链表的建立、遍历、查找、插入和删除操作

链表(Linked List)是一种物理存储单元上非连续、非顺序的数据结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(node,链表中每一个元素称为结点)组成,每一次为一个结构体 动态分配的内存空间,可称之为一个结点,每个结点之间可以是不连续的,但结点内是连续的。结点个数是不受限定的,可以随时删改,这是与数组相比的优点。.........

追求。 1万+

自动驾驶系统架构解析:从传感器到决策控制的完整链路(附实际案例)

本文深入解析了自动驾驶系统从感知、决策到控制的完整架构链路。通过对比摄像头、毫米波雷达、激光雷达等核心传感器的特性与选型策略,阐述了多传感器融合的必要性。文章结合行为决策、运动规划及控制执行的实际案例,揭示了系统集成、数据闭环与功能安全等工程化落地的关键挑战,为理解自动驾驶技术提供了清晰的蓝图。

weixin_29051811的博客 338

数字孪生驱动的城市地下管网智能运维与应急处置决策支持系统

上海市城市数字化中心的数据实践显示,通过关联分析管网材质与故障率的关系,将铸铁管更换周期从15年优化至8年(李敏,2021)。环境效益方面,上海市通过优化管网运行参数,年减少碳排放1.8万吨,相当于种植36万棵乔木。数字孪生与物理设备的双向交互采用OPC UA协议实现,某次天津管网渗漏事件中,系统通过实时数据反馈,指导现场人员调整注浆方案,将修复时间从48小时压缩至16小时。虚拟指挥沙盘支持多视角协同,深圳水务系统的实践表明,通过AR可视化技术,跨部门会议效率提升60%,方案决策时间缩短40%。

2501_92431686的博客 1424

【数据结构篇C++实现】- 线性表 - 顺序表和链表

线性表知识总结,一文搞懂什么是顺序表与链表,以及常见的操作

陈七的博客,学习知识分享,期待与大家的交流 4258

Esp32蓝牙Hid调用方案 http执行设备、鼠标、键盘相关操作

本文主要介绍 Esp32 蓝牙 Hid 相关的多种操作方式,详细的设备、鼠标、键盘相关操作的 http 调用方法。下面是整理出的所有 http 调用方法和 rhino 引擎方式。本机调用的话直接使用http://localhost:8080 如果是局域网调用则使用软件里的地址 比如我的是http://192.168.1.5:8080。文件地址: https://www.123865.com/s/Qtm4jv-xyZbd?使用前需要一块烧录好的ESP32板子并在手机安装好embedded软件用于蓝牙通信。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 569

C/C++数据结构(三) —— 双向带头循环链表

【数据结构系列】链表之双向带头循环链表的基本操作

Edison's 小宇宙 1万+

开篇词:学习系统分析师的好处?核心考点有哪些?

系统分析师备考指南 系统分析师是IT行业的高级专业人才,具备系统分析与设计能力,能指导开发团队工作。学习系统分析师不仅能获得职业晋升的"黄金跳板",还能全面提升技术架构思维和业务理解能力。 核心价值: 职业发展:晋升管理岗位的硬性要求,突破职业天花板 能力提升:构建T型知识结构,培养架构思维和软技能 市场竞争力:成为"业务+技术"桥梁,获得国家级专业认证 考试内容: 计算机基础知识(硬件、操作系统、网络等) 系统分析专业知识(软件工程、架构设计等) 进阶知识(企业信息

数据知道的博客 5940

把 ABAP ALV 表头做成两层分组:用 TOP-OF-PAGE 手工绘制双行列标题

摘要:本文介绍了在SAP ALV List中实现双层表头的方法。通过关闭系统默认列标题(no_colhead='X'),在TOP_OF_PAGE事件中手动绘制表头,使用sy-uline和sy-vline绘制线条实现分组效果。关键点包括:1)关闭系统表头;2)在事件处理中分两行输出分组标题和字段名;3)利用系统自动拼接线条的特性绘制表格边框。文中还指出了常见问题如线条自动粘连、颜色不生效等,并提供了完整示例代码和详细解释。这种方法适用于需要对字段进行业务分组的报表场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 258

单链表的基本操作C/C++代码实现

插入: 删除: 线性表的链式存储特点: 链表是一种顺序存取结构,按位置访问链表中第i个元素时,只能从表头开始依次向后遍历链表,直到找到第i个位置上的元素,时间复杂度为O(n), 即取值操作的效率低。但在确定插入或删除的位置后,插入或删除操作无需移动数据,只需要修改指针, 时间复杂度为0(1)。 基于此,若线性表的主要操作是和元素位置紧密相关的这类取值操作,很少做插入或删除时, 宜采用顺序表作为存储结构。 对于频繁进行插入或删除操作的线性表,宜采用链表作为存储结构。 代码如下: 注意:删除算法中的循环条件

Ycy的博客 3574

YOLOv11【第三章:高阶应用与落地篇·第7节】多任务联合训练(Multi-Task Learning):检测+分割+关键点三头并进!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 727

C/C++数据结构-完整代码(一)数据结构的理论,线性表(动态数组,链表)(完整的算法代码-增删改查-代码解析+运行结果解析)

一、数据结构理论 1、数据 数据∶是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输 入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、 图像、视频等非数值类型。 2、数据结构概念 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定 关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 数据结构往往同高效的检索算法和索引技术有关。 数据结构是计算机存储、组织数据的方式。是相互之间存在一种或多种特定

程序员猫爪 1744

滤波算法实现大全——基于匀速直线运动模型的kalman滤波算法

滤波算法实现大全——基于匀速直线运动模型的kalman滤波算法

jane0819的博客 522

Java的API帮助文档

JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。 JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。 JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。 官网下载: 1、登录Oracle官网(Oracl.

人生得意须尽欢 2万+

(C++版)链表(一)——实现单向链表创建、插入、删除等相关操作

前段时间用C

菜鸟学C/C++ 3万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

《数据结构》--链表【包含跳表概念】

不知道大家对熟悉还是陌生,我们秉着基础不牢,地动山摇的原则,会一点点的介绍链表的,毕竟链表涉及的也很重要的。在这之前,我们认识过的顺序表,它其实就是一个特殊的数组。那链表到底是什么?又有什么用呢?与顺序结构有什么不一样呢?

Stark的博客 2382

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【数据结构】单链表的实现及其相关操作C/C++

本文将重点讲述单链表的创建以及相关操作的实现。其实在理解链表并不是什么困难的事情,很多人说指针很难,主要是被链表当中的指针的相关操作给难住了。在编写代码的时候需要指针的相关知识。建议大家先熟悉之前学过的指针的相关知识,这样再去理解链表就会变得轻松许多。 这里是一个讲解单链表的视频:https://www.bilibili.com/video/BV1Rb411F738?t=2521 希望大家可以实际编写相关代码,有助于更好的理解。下面是相关代码的展示: #include<cstdio> #incl

wjy_YF的博客 398

C/C++之数据结构

前言 下面我将记录学习到的c/c++语言相关的数据结构。

camille的专栏 1475

数据结构(严蔚敏C语言版)-单链表的基本操作总结

文章目录一、引言二、代码语言与编译器完整代码运行截图分步记录1.基本操作函数声明2.函数定义3.主函数 一、引言 最近学习数据结构,从严蔚敏C语言版开始学习,现已将第二章单链表相关内容的伪代码调通在编译器中成功编辑,现将代码附上方便自己日后复习和大家采纳与指正。 二、代码语言与编译器 代码使用C++在dev下写的,因为C语言对引用不是很支持,而课本主要指导利用引用进行算法的书写,故使用C++。大同...

plus_left的博客 3044
上一篇: 5-顺序表查找及插入问题
下一篇: 7-蛇形二维数组
outer_star
博客等级 码龄14年 8粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值