链表基本操作

1.单链表定义

//单链表结点类型描述
typedef struct LNode{
    int data;                //数据域
    struct LNode *next;      //指针域
}LNode,*LinkList;

 

2.单链表基本操作实现

2.1 头插法建立单链表(逆序)

//头插法建立单链表
LinkList List_HeadInsert(LinkList &L,int n)
{
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
    }
    return L;
}

 

2.2 尾插法建立单链表(顺序)

//尾插法建立单链表
LinkList List_TailInsert(LinkList &L,int n)
{
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    LNode *s,*r=L;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
    }
    r->next=NULL;
    return L;
}

 

2.3 按序号查找结点值

//按序号查找单链表L(带头结点)中第i个位置结点指针
LNode *GetElem(LinkList L,int i)
{
    int j=1;
    LNode *p=L->next;
    if(i==0) return L;
    if(i<1) return NULL;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}

 

2.4 按值查找表结点

//按值查找表结点
LNode *LocateElem(LinkList L,int e)
{
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e) p=p->next;
    return p;
}

 

2.5 插入结点操作

//插入结点操作
/*调用GetElem(L,i-1),查找第i-1个结点,再在其后插入新结点*/
LinkList InsertNode(LinkList &L,int i)
{
    LNode *p,*s;
    s=(LNode*)malloc(sizeof(LNode));
    s->data=100;
    p=GetElem(L,i-1);
    s->next=p->next;
    p->next=s;
    return L;
//    //将*s结点插入到*p结点之前的主要代码
//    int temp=0;
//    s->next=p->next;
//    p->next=s;
//    temp=p->data;
//    p->data=s->data;
//    s->data=temp;
}

 

2.6 删除结点操作

//删除结点操作
LinkList DeleteNode(LinkList &L,int i)
{
    //结点*p为找到的被删除结点的前驱结点
    LNode *p,*q;
    p=GetElem(L,i-1);
    q=p->next;
    p->next=q->next;
    free(q);
    return L;
    //删除结点*p
    //法一:先找到*p的前驱结点,再执行删除操作,时间复杂度为O(n)
    //法二:将*p后继结点值赋予自身,再删除后继结点,时间复杂度为O(1)
//    q=p->next;
//    p->data=q->data;
//    p->next=q->next;
//    free(q);
}

 

3.运行代码

#include <iostream>
using namespace std;
int arr[100];

//单链表结点类型描述
typedef struct LNode{
    int data;                //数据域
    struct LNode *next;      //指针域
}LNode,*LinkList;

//头插法建立单链表
LinkList List_HeadInsert(LinkList &L,int n)
{
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
    }
    return L;
}

//尾插法建立单链表
LinkList List_TailInsert(LinkList &L,int n)
{
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    LNode *s,*r=L;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
    }
    r->next=NULL;
    return L;
}

//List_HeadInsert函数+outPutValue函数可实现头插法建立单链表以及逆序输出结点数据值
/*
10
12 23 18 90 32 17 67 45 89 13
13 89 45 67 17 32 90 18 23 12
*/
void outPutValue(LinkList L)
{
    LNode *s=L->next;
    while(s!=NULL)
    {
        cout<<s->data<<" ";
        s=s->next;
    }
    cout<<endl;
}

//按序号查找单链表L(带头结点)中第i个位置结点指针
LNode *GetElem(LinkList L,int i)
{
    int j=1;
    LNode *p=L->next;
    if(i==0) return L;
    if(i<1) return NULL;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}

//按值查找表结点
LNode *LocateElem(LinkList L,int e)
{
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e) p=p->next;
    return p;
}

//插入结点操作
/*调用GetElem(L,i-1),查找第i-1个结点,再在其后插入新结点*/
LinkList InsertNode(LinkList &L,int i)
{
    LNode *p,*s;
    s=(LNode*)malloc(sizeof(LNode));
    s->data=100;
    p=GetElem(L,i-1);
    s->next=p->next;
    p->next=s;
    return L;
//    //将*s结点插入到*p结点之前的主要代码
//    int temp=0;
//    s->next=p->next;
//    p->next=s;
//    temp=p->data;
//    p->data=s->data;
//    s->data=temp;
}

//删除结点操作
LinkList DeleteNode(LinkList &L,int i)
{
    //结点*p为找到的被删除结点的前驱结点
    LNode *p,*q;
    p=GetElem(L,i-1);
    q=p->next;
    p->next=q->next;
    free(q);
    return L;
    //删除结点*p
    //法一:先找到*p的前驱结点,再执行删除操作,时间复杂度为O(n)
    //法二:将*p后继结点值赋予自身,再删除后继结点,时间复杂度为O(1)
//    q=p->next;
//    p->data=q->data;
//    p->next=q->next;
//    free(q);
}

int main()
{
    int n;
    LinkList L;
    LNode *s,*t;
    cin>>n;
//    List_HeadInsert(L,n);
    List_TailInsert(L,n);
    outPutValue(L);
//    s=GetElem(L,3);
//    cout<<s->data;
//    t=LocateElem(L,2);
    InsertNode(L,3);
    outPutValue(L);
    DeleteNode(L,3);
    outPutValue(L);
    return 0;
}
/*
5
23 12 56 78 90
23 12 56 78 90
23 12 100 56 78 90
23 12 56 78 90
*/

 

 

 

posted @ 2021-02-04 23:56  yyer  阅读(200)  评论(0编辑  收藏  举报