数据结构第二篇——单链表的基本操作

代码简要:本篇文章讲述了单链表的创建,插入,删除,以及得到某个位置值等的操作
谢谢大家的支持。

//测试时需要输入10个数据进行测试
#include<iostream>
#include<cstdio>
using namespace std;
typedef struct lnode{
  int data;
  struct lnode *next;
}lnode,*linklist;
void  creatlist(linklist &l,int n){
  l=(linklist) malloc(sizeof(lnode));
  l->next=NULL;//建立一个带头结点的链表
  for(int i=1;i<=n;i++){
    linklist p;
    p=(linklist)malloc(sizeof(lnode));//C语言中动态分配内存的方法
    cin>>p->data;
    p->next=l->next;//先让p指向l的下一个指针域
    l->next=p;//然后用l指向p。
  }
}//创建一个链表,并且输入数据。
int listinsert(linklist &l,int i,int e){
  linklist p;
  p=l;
  int j=0;
  while(p&&j<i-1){//寻找第i-1个结点
    p=p->next;
    j++;
  }
  if(!p||j>i-1){//如果没有寻找到或者超出范围则退出
    return 0;
  }
  linklist s;//创建结点
  s=(linklist)malloc(sizeof(lnode));//建立即将插入的新节点
  s->data=e;
  s->next=p->next;//插入操作,先将p的下一个指针域赋值给s
  p->next=s;//然后让s为p的下一个指针域
  return 1;//进行头插所以数据是相反的。
}//在链表中将进行插入操作
int  listdelete(linklist &l,int i){
  linklist p;
  p=l;
  int j=0;
  while(p->next&&j<i-1){//找到第i个结点
    p=p->next;
    ++j;
  }
  while(!p->next||j>i-1){//未找到的结果
    return 0;
  }
  linklist q;
  q=p->next;
  p->next=q->next;//指向下下个结点
  free(q);//释放这段内存,c语言方法
  return 1;
}//删除一个结点。
int getelem(linklist &l,int i,int &e){
  //l是带有头结点的单链表的头指针
  linklist p;
  p=l->next;
  int j=1;
  while(p&&j<i){
    p=p->next;
    j++;
  }
  if(!p||j>i){
    return 0;
  }
  e=p->data;
  return 1;
}//获得第i个位置的值。
void mergelist(linklist &a,linklist &b,linklist &c){
  //已知单链表a,b的元素按照递减
  //所以c也是递减的。
  linklist pa,pb,pc;
  pa=a->next;
  pb=b->next;
  c=pc=a;//用a的头结点作为c的头结点。c一直不变,但是pc接下来要用所以要申请两个那个
  while(pa&&pb){
    if(pa->data<=pb->data){
      pc->next=pa;//将pa插入到pc中
      pc=pa;//pc后移,为下一次插入做准备
      pa=pa->next;//pa后移
    }
    else
    {
      pc->next=pb;//跟上述pa的操作相同。
      pc=pb;
      pb=pb->next;
    }
  }
  pc->next=pa?pa:pb;
  free(b);
}
void printf_list(linklist &l){
  linklist q;
  q=l->next;
  while(q){
    cout<<q->data<<" ";
    q=q->next;
  }
  cout<<endl;
}
int main(int argc, char const *argv[]) {
  linklist l1,l2,l3;
  int n=10,a=0;
  creatlist(l1,n);
  creatlist(l2,n);
  printf_list(l1);
  cout<<"_____________________________"<<endl;
  printf_list(l2);
  cout<<"_____________________________"<<endl;
  listinsert(l1,3,11);
  printf_list(l1);
  cout<<"_____________________________"<<endl;
  listdelete(l1,5);
  printf_list(l1);
  cout<<"_____________________________"<<endl;
  getelem(l1,4,a);
  cout<<a<<endl;
  cout<<"_____________________________"<<endl;
  mergelist(l1,l2,l3);
  printf_list(l3);
  return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值