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

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;
}
相关推荐
t***5449 小时前
如何在现代C++中更有效地应用这些模式
java·开发语言·c++
itman3019 小时前
C语言、C++与C#深度研究:从底层到现代开发演进全解析
c语言·c++·c·内存管理·编译模型
Hical_W11 小时前
为 C++ Web 框架设计三层 PMR 内存池:从原理到实战
c++·github
BestOrNothing_201511 小时前
C++零基础到工程实战(3.6):逻辑实战示例—日志模块
c++·命令行参数·main函数·switch case·逻辑判断·if else·enum class
t***54411 小时前
有哪些常见的架构设计模式在现代C++中应用
开发语言·c++
zopple12 小时前
汇编、C、C++和Java核心技术对比
c语言·汇编·c++
汉克老师13 小时前
GESP2024年3月认证C++三级( 第三部分编程题(1、字母求和)
c++·string·gesp三级·gesp3级·大小写判断
沐雪轻挽萤13 小时前
10. C++17新特性-保证的拷贝消除 (Guaranteed Copy Elision / RVO)
开发语言·c++
leaves falling13 小时前
C/C++ 的内存管理,函数栈帧详讲
java·c语言·c++
wuyoula14 小时前
AI导航智能决策系统源码 附教程
c++·tcp/ip·源码