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

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;
}
相关推荐
大白同学4211 小时前
【C++】C++11介绍(Ⅱ)
开发语言·c++
油炸自行车2 小时前
【Qt】编写Qt自定义Ui控件步骤
开发语言·c++·qt·ui·自定义ui控件·qt4 自定义ui控件
呱呱巨基3 小时前
C/C++ 内存管理
c++·笔记·学习
半桔3 小时前
【网络编程】TCP 服务器并发编程:多进程、线程池与守护进程实践
linux·服务器·网络·c++·tcp/ip
橘子134 小时前
C++实战:搜索引擎项目(二)
开发语言·c++·搜索引擎
应用市场4 小时前
Qt C++ 图形绘制完全指南:从基础到进阶实战
开发语言·c++·qt
青草地溪水旁5 小时前
设计模式(C++)详解—单例模式(2)
c++·单例模式
bkspiderx5 小时前
C++时区操作全版本指南(含C++03/C++11-17/C++20)
linux·开发语言·c++·c++20·时区
序属秋秋秋5 小时前
《C++进阶之STL》【哈希表】
数据结构·c++·stl·哈希算法·散列表·哈希表·哈希
青草地溪水旁6 小时前
设计模式(C++)详解——建造者模式(1)
c++·设计模式·建造者模式