单链表的基本操作

第1关:单链表的插入操作

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);
/* 单链表类型定义 */
typedef struct LNnode
{    
    ElemType data;
    struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));

int main()               //main() function 
{    
     LinkList A;
     ElemType e;
     InitList(A);
      int n,i;
     // cout<<"Please input the list number ";
     cin>>n;
     for(i=1;i<=n;i++)
        { 
           cin>>e;
         ListInsert(A, i, e);
       }
    //cout<<"请输入插入的位置:"<<endl;
    cin>>i;
    //cout<<"请输入插入的值:"<<endl;
    input(e);
    if(  ListInsert(A,i,e) )
    {
      cout<<"插入成功,插入后单链表如下:"<<endl;
      ListTraverse(A,output) ;
    }
    else
        cout<<"插入位置不合法,插入失败!"<<endl;
    return  0;  
 }


/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
cin>>s;
}
void output(ElemType s)
 {
cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
    if(a==b)
        return  1;
    else
        return  0;
}

/*****单链表的基本操作*****/
void InitList(LinkList &L)
{ 
    // 操作结果:构造一个空的单链表L
    /********** Begin **********/ 
    L=(LinkList)malloc(sizeof(LNnode)); 
    if(!L) 
    {
        L->next=NULL;      
    }
}                           
    
    
    /********** End **********/
int ListInsert(LinkList &L,int i,int e) 
{
    // 在带头结点的单链线性表L的第i个元素之前插入元素e  
    /********** Begin **********/ 
    int j=0;
    LinkList p=L,s;
    while( p && j<i-1 )                  // p指向第i-1个结点
    {
        p=p->next;
        j++;
    }
    if(!p || j>i-1) 
         return 0;

                    // i小于1或者大于表长
       
    s=(LinkList)malloc(sizeof(LNnode));   // s指向新生成的结点
    s->data=e;                           // 将e存入新结点的数据域
    s->next=p->next;                     // ①新结点s的指针域指向第i个结点
    p->next=s;                 

    /********** End **********/
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 
    // 初始条件:单链表L已存在。
    //操作结果:依次对L的每个数据元素调用函数vi()
    /********** Begin **********/ 
   LinkList p=L->next;   //p指向单链表第一个结点
   while( p )
   {
     vi(p->data);
     p = p->next;
   }
    /********** End **********/
}

第2关:单链表的删除操作

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{    
    ElemType data;
    struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
int ListDelete(LinkList L,int i,ElemType &e);
void ListTraverse(LinkList L,void(*vi)(ElemType));

int main()               //main() function 
{    
    LinkList A;
    ElemType e;
    InitList(A);
    int n,i;
    // cout<<"Please input the list number ";
    cin>>n;
    for(i=1;i<=n;i++)
    { 
        cin>>e;
        ListInsert(A, i, e);
    }
    //cout<<"请输入删除的位置:"<<endl;
    cin>>i;    
    if(  ListDelete(A,i,e) )
    {
        cout<<"删除成功,删除后单链表如下:"<<endl;
        ListTraverse(A,output) ;
        cout<<"删除元素的值:";
       output(e);
          cout<<endl;
    }
    else
        cout<<"删除位置不合法,删除失败!"<<endl;
}



/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
    cin>>s;
}
void output(ElemType s)
{
    cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
    if(a==b)
        return  1;
    else
        return  0;
}

/*****单链表的基本操作*****/
void InitList(LinkList &L)
{     // 构造一个空的单链表L    
    L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
    if(!L) // 存储分配失败
        return ;
    L->next=NULL; // 指针域为空
    
}

int ListInsert(LinkList &L,int i,ElemType e) 
{    // 在带头结点的单链线性表L的第i个元素之前插入元素e  
    LinkList p,s;
    p = L;   
    int j = 0;
    while (p && j < i-1) {  // 寻找第i-1个结点
        p = p->next;
        ++j;
    } 
    if (!p || j > i-1) 
        return 0;                   // i小于1或者大于表长
    s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
    s->data = e;  s->next = p->next;      // 插入L中
    p->next = s;
    return 1;
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{     // 调用函数vi()依次输出单链表L的每个数据元素
    LinkList p=L->next;
    while(p)
    {
        vi(p->data);
        p=p->next;
    }
    printf("\n");    
}

int  ListDelete(LinkList L,int i,ElemType &e) // 算法2.10。不改变L
{ 
    // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
    /********** Begin **********/ 
    LinkList p=L;
    int n=0;
    if(i<1)
    return 0;
    while(p->next!=NULL && n<i-1)
    {
        n++;
        p=p->next;
    } 
   if(p->next==NULL)
   return 0;
    LNnode *q=p->next;
    e=q->data;
    p->next=q->next;
   
    return 1;

    
    /********** End **********/
}

第3关:单链表的按照序号查找值操作

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{    
    ElemType data;
    struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));
int GetElem(LinkList L,int i,ElemType &e) ;

int main()               //main() function 
{    
    LinkList A;
    ElemType e;
    InitList(A);
    int n,i;
    // cout<<"Please input the list number ";
    cin>>n;
    for(i=1;i<=n;i++)
    { 
        cin>>e;
        ListInsert(A, i, e);
    }
    //cout<<"请输入查找的序号:"<<endl;
    cin>>i;    
    if(  GetElem(A,i,e) )
    {
        cout<<"查找成功!"<<endl;
        cout<<"第"<<i<<"个元素的值:"<<endl;
        output(e);
        cout<<endl;
    }
    else
        cout<<"查找失败!"<<endl;
}

/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
    cin>>s;
}
void output(ElemType s)
{
    cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
    if(a==b)
        return  1;
    else
        return  0;
}

/*****单链表的基本操作*****/
void InitList(LinkList &L)
{     // 操作结果:构造一个空的单链表L
    L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
    if(!L) // 存储分配失败
        return ;
    L->next=NULL; // 指针域为空
    
}

int ListInsert(LinkList &L,int i,ElemType e) 
{    // 在带头结点的单链线性表L的第i个元素之前插入元素e  
    LinkList p,s;
    p = L;   
    int j = 0;
    while (p && j < i-1) {  // 寻找第i-1个结点
        p = p->next;
        ++j;
    } 
    if (!p || j > i-1) 
        return 0;                   // i小于1或者大于表长
    s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
    s->data = e;  s->next = p->next;      // 插入L中
    p->next = s;
    return 1;
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{     // 初始条件:单链表L已存在。
    //操作结果:依次对L的每个数据元素调用函数vi()
    LinkList p=L->next;
    while(p)
    {
        vi(p->data);
        p=p->next;
    }
    printf("\n");
}

int GetElem(LinkList L,int i,ElemType &e) 
{ 
    // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回1,否则返回0
    /********** Begin **********/ 
    int j=0;
    LinkList p=L;
    while(p && j<i)
    {
      
      p=p->next;
      ++j;
    }
    if(!p || j>i)
    return 0;
    e=p->data;
    return 1;
    /********** End **********/
}

第4关:单链表的按照值查找结点位序的操作

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;


/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{    
    ElemType data;
    struct LNnode *next;
}LNnode,*LinkList;
void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));
int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType));
int main()               //main() function 
{    
    LinkList A;
    ElemType e;
    InitList(A);
    int n,i;
    // cout<<"Please input the list number ";
    cin>>n;
    for(i=1;i<=n;i++)
    { 
        cin>>e;
        ListInsert(A, i, e);
    }
    //cout<<"请输入查找的元素:"<<endl;
    cin>>e;    
    i=LocateElem(A,e,equals);
    if( i ) 
    {
        cout<<"查找成功!"<<endl;        
        output(e);
      cout<<"是单链表第"<<i<<"个元素"<<endl;
    }
    else
        cout<<"查找失败!"<<endl;
}



/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
    cin>>s;
}
void output(ElemType s)
{
    cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
    if(a==b)
        return  1;
    else
        return  0;
}

/*****单链表的基本操作*****/
void InitList(LinkList &L)
{     // 操作结果:构造一个空的单链表L
    L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
    if(!L) // 存储分配失败
        return ;
    L->next=NULL; // 指针域为空    
}

int ListInsert(LinkList &L,int i,ElemType e) 
{    // 在带头结点的单链线性表L的第i个元素之前插入元素e  
    LinkList p,s;
    p = L;   
    int j = 0;
    while (p && j < i-1) {  // 寻找第i-1个结点
        p = p->next;
        ++j;
    } 
    if (!p || j > i-1) 
        return 0;                   // i小于1或者大于表长
    s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
    s->data = e; 
    s->next = p->next;      // 插入L中
    p->next = s;
    return 1;    
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{     // 初始条件:单链表L已存在。
    //操作结果:依次对L的每个数据元素调用函数vi()
    LinkList p=L->next;
    while(p)
    {
        vi(p->data);
        p=p->next;
    }
    printf("\n");
}

int LocateElem(LinkList L,ElemType e,int (*equal)(ElemType,ElemType))
{ 
    // 初始条件: 单链表L已存在,equal()是数据元素判定函数(满足为1,否则为0)
    // 操作结果: 返回L中第1个与e满足关系equal()的数据元素的位序,若这样的数据元素不存在,则返回值为0
    /********** Begin **********/ 
    LinkList p=L->next;
    int n=0;
    while(p->next)
    {
        n++;
        if(equal(e,p->data))
        return n;
        p=p->next;
    }
    return 0;
    /********** End **********/
}

第5关:单链表的逆置操作

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{    
    ElemType data;
    struct LNnode *next;
}LNnode,*LinkList;
void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));
void reverse (LinkList  L);
int main()               //main() function 
{    
    LinkList A;
    ElemType e;
    InitList(A);
    int n,i;
    // cout<<"Please input the list number ";
    cin>>n;
    for(i=1;i<=n;i++)
    { 
        cin>>e;
        ListInsert(A, i, e);
    }
    cout<<"逆置单链表:"<<endl;
    reverse(A);
    ListTraverse(A,output) ;    
}

/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
    cin>>s;
}
void output(ElemType s)
{
    cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
    if(a==b)
        return  1;
    else
        return  0;
}

/*****单链表的基本操作*****/
void InitList(LinkList &L)
{     // 操作结果:构造一个空的单链表L
    L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
    if(!L) // 存储分配失败
        return ;
    L->next=NULL; // 指针域为空    
}

int ListInsert(LinkList &L,int i,ElemType e) 
{    // 在带头结点的单链线性表L的第i个元素之前插入元素e  
    LinkList p,s;
    p = L;   
    int j = 0;
    while (p && j < i-1) {  // 寻找第i-1个结点
        p = p->next;
        ++j;
    } 
    if (!p || j > i-1) 
        return 0;                   // i小于1或者大于表长
    s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
    s->data = e;  s->next = p->next;      // 插入L中
    p->next = s;
    return 1;    
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{     // 初始条件:单链表L已存在。
    //操作结果:依次对L的每个数据元素调用函数vi()
    LinkList p=L->next;
    while(p)
    {
        vi(p->data);
        p=p->next;
    }
    printf("\n");    
}

void reverse (LinkList  L)
{  
    //逆置L指针所指向的单链表
    /********** Begin **********/ 
    LinkList p=L->next;
    LinkList m;
    L->next=NULL;
    while(p)
    {
        m=p;
        p=p->next;
        m->next=L->next;
        L->next=m;

    }


    
    /********** End **********/
}

第6关:两个有序单链表的合并操作

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{    
    ElemType data;
    struct LNnode *next;
}LNnode,*LinkList;
void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc);

int main()               //main() function 
{    
    LinkList A,B,C;
    ElemType e;
    InitList(A);
    InitList(B);
    int n,i;
    // cout<<"Please input the list number ";
    cin>>n;
    for(i=1;i<=n;i++)
    { 
        cin>>e;
        ListInsert(A, i, e);
    }
    cin>>n;
    for(i=1;i<=n;i++)
    { 
        cin>>e;
        ListInsert(B, i, e);
    }
    cout<<"合并两个有序单链表:"<<endl;
    MergeList(A,B,C);    
    ListTraverse(C,output) ;    
}

/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
    cin>>s;
}
void output(ElemType s)
{
    cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
    if(a==b)
        return  1;
    else
        return  0;
}

/*****单链表的基本操作*****/
void InitList(LinkList &L)
{     // 操作结果:构造一个空的单链表L
    L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
    if(!L) // 存储分配失败
        return ;
    L->next=NULL; // 指针域为空    
}

int ListInsert(LinkList &L,int i,ElemType e) 
{    // 在带头结点的单链线性表L的第i个元素之前插入元素e  
    LinkList p,s;
    p = L;   
    int j = 0;
    while (p && j < i-1) {  // 寻找第i-1个结点
        p = p->next;
        ++j;
    } 
    if (!p || j > i-1) 
        return 0;                   // i小于1或者大于表长
    s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
    s->data = e;  s->next = p->next;      // 插入L中
    p->next = s;
    return 1;    
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{     // 初始条件:单链表L已存在。
    //操作结果:依次对L的每个数据元素调用函数vi()
    LinkList p=L->next;
    while(p)
    {
        vi(p->data);
        p=p->next;
    }
    printf("\n");    
}

void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc) 
{
    // 已知单链线性表La和Lb的元素按值非递减排列。
    // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
    /********** Begin **********/ 
    LinkList pa=La->next;
    LinkList pb=Lb->next;
    LinkList pc;
    Lc=La;
    pc=Lc;
    while(pa && pb)
    {
        if(pa->data>=pb->data)
        {
            pc->next=pb;
            pc=pb;
            pb=pb->next;

        }
        else
        {
            pc->next=pa;
            pc=pa;  
            pa=pa->next;
        }
    }
    if(pa)
    {
        pc->next=pa;
    }
    else
    pc->next=pb;
    
    /********** End **********/
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ଲଇଉକ ଲ ̊ଳ

多谢大哥赏赐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值