线性表的链式表示——单链表;头插,尾插,按值查找,按序号查找,插入,删除;

cpp 复制代码
#include <iostream>
#include <algorithm>//fill()
#define InitSize 5

using namespace std;

/*线性表:链式表示------单链表;头插,尾插,按值查找,按序号查找,插入,删除*/
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

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

LinkList List_HeadInsert(LinkList &L){
    LNode *s;
    int x;
    L=(LNode *)malloc(sizeof(LNode));
    L->next=NULL;
    scanf("%d",&x);
    while(x!=999){
        s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}

LinkList List_TailInsert(LinkList &L){
    LNode *s,*r;
    int x;
    L=(LNode *)malloc(sizeof(LNode));
    L->next=NULL;
    r=L;
    scanf("%d",&x);
    while(x!=999){
        s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
    return L;
}

LNode *GetElem(LinkList L,int i){//得到第i个位置(头节点的下一个节点为第1个位置);
    LNode *p=L->next;
    int j=1;
    if(i==0)
        return NULL;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    return p;
}

LNode *GetElem2(LinkList L,int e){
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e)
        p=p->next;
    return p;
}

LinkList List_Insert(LinkList &L,LNode *s,int i){//插入到第i个位置(头节点的下一个节点为第1个位置);前插操作:先找到i-1,插到i-1的后面
    LNode *p;
    p=GetElem(L,i-1);
    s->next=p->next;
    p->next=s;
    return L;
}

LinkList List_Insert2(LinkList &L,LNode *s,LNode *p){//已给出s和p,将s插入到p的前面:先插到后面,再交换值
    s->next=p->next;
    p->next=s;
    int temp;
    temp=p->data;
    p->data=s->data;
    s->data=temp;
    return L;
}

LinkList List_Delete(LinkList &L,int i){//删除第i个结点
    LNode *p;
    p=GetElem(L,i-1);
    LNode *q;
    q=(LNode *)malloc(sizeof(LNode));
    q=p->next;
    p->next=q->next;
    free(q);
    return L;
}

LinkList List_Delete2(LinkList &L,LNode *p){
    LNode *q;
    q=(LNode *)malloc(sizeof(LNode));
    q=p->next;
    p->data=p->next->data;
    p->next=q->next;
    free(q);
    return L;
}
int main()
{

    /*线性表:链式表示------单链表;头插,尾插,按值查找,按序号查找,插入第i个位置,插入已给结点的后面,删除第i个结点,删除已给结点*/
    /*LinkList L2;
    List_HeadInsert(L2);
    List_Output(L2);*/

    LinkList L;
    List_TailInsert(L);
    List_Output(L);

    //LNode *s;
    //s=GetElem(L,2)//获取第i个结点(头节点的下一个节点为第1个位置)
    //printf("%d\n",s->data);

    //LNode *s1=GetElem(L,3);
    //GetElem2(L,2);
    //printf("%d\n",s1->data);

    /*LNode *s3;
    s3=(LNode *)malloc(sizeof(LNode));
    s3->data=9;
    List_Insert(L,s3,2);//插入到第i个位置
    List_Output(L);*/

    /*LNode *p=GetElem(L,2);
    LNode *s2;
    s2=(LNode *)malloc(sizeof(LNode));
    s2->data=9;
    List_Insert2(L,s2,p);//将s插入到p的前面
    List_Output(L);*/

    //List_Delete(L,2);
    //List_Output(L);

    /*LNode *p;
    p=L->next->next;//给出需要删除的结点
    List_Delete2(L,p);
    List_Output(L);*/

    return 0;
}
相关推荐
lclin_20206 小时前
VS2010兼容|C++系统全能监控工具(彩色界面+日志带单位+完整版)
c++·windows·系统监控·vs2010·编程实战
paeamecium8 小时前
【PAT甲级真题】- Cars on Campus (30)
数据结构·c++·算法·pat考试·pat
UrSpecial9 小时前
从零实现C++轻量线程池
c++·线程池
chh5639 小时前
C++--模版初阶
c语言·开发语言·c++·学习·算法
会编程的土豆10 小时前
01背包与完全背包详解
开发语言·数据结构·c++·算法
hetao173383711 小时前
2026-04-12~14 hetao1733837 的刷题记录
c++·算法
智者知已应修善业12 小时前
【51单片机4位数循环小数位移数值位移】2023-6-9
c++·经验分享·笔记·算法·51单片机
王璐WL12 小时前
【C++】string,vector和list对比
c++·list
不爱吃炸鸡柳13 小时前
算法复杂度从入门到精通:时间与空间复杂度全解析
开发语言·c++·算法
拳里剑气13 小时前
C++算法:二分查找
c++·算法·二分查找·学习方法