温馨提示:下面代码默认链表数据为字符型,本代码仅供参考,希望能对找到本随笔的人有所帮助!

 #include<iostream>
 using namespace std;
 typedef struct Lnode
 {
  char data;
  struct Lnode *next;
 }LN;
 LN *CreateLinkList()
 {
  LN *head,*p,*pre;
  char ch;
  ;
  head=(LN *)malloc(sizeof(LN));
  head->next=NULL;
  pre=head;
  )
  {
   cout<<"输入第"<<i<<"个节点数据:";
   while((ch=cin.get())!='\n')
   {
   cin.get();
   p=(LN *)malloc(sizeof(LN));
   pre->next=p;
   p->next=NULL;
   p->data=ch;
   pre=p;
   i++;
   break;
   }
   if(ch=='\n')
      break;
  }
   pre->next=NULL;
  return head;
 }
 int LinkListLength(LN *head)
 {
  ;
  LN *p;
  p=head->next;
  if(p==NULL)
  {
   ;
  }
  else
  {
  while(p->next)
  {
   p=p->next;
   count++;
  }
  return count;
  }
 }
 void SearchData(int i,LN *head)
 {
  LN *p;
  ;
  p=head->next;
  cout<<"输入要查找的节点:";
  cin>>i;
  )
  {
   p=p->next;
   j++;
  }
   if(!p)
  {
   cout<<"该节点不存在!"<<endl;
  }
  else
  {
  cout<<"该节点数据为:"<<p->data<<endl;
  }
 }

 LN *SearchSpecificData(char ch,LN * head)
 {
  LN *p;
  ;
  p=head->next;
  while(p)
  {
   if(p->data==ch)
   {
    cout<<"该数据是链表中第"<<count<<"个数据!"<<endl;
    return p;
    break;
   }
   else
   {
    p=p->next;
    count++;
   }
  }
  if(p==NULL)
  {
   cout<<"链表中不存在该数据!"<<endl;
   return NULL;
  }
 }
 LN *InsertData(int i,LN *head)
 {
  LN *p,*insert;
  ;
  char ch;
  cout<<"输入要插入的数据:";
  cin>>ch;
  cout<<"输入元素插入的位置:";
  cin>>i;
  )
  {
   cout<<"插入错误!"<<endl;
   return NULL;
  }
  )
  {
   insert=(LN *)malloc(sizeof(LN));
   insert->next=head->next;
   head->next=insert;
   insert->data=ch;
   return head;
  }
  else
  {
  p=head->next;
  )
  {
   p=p->next;
   j++;
  }
  insert=(LN *)malloc(sizeof(LN));
  insert->data=ch;
  insert->next=p->next;
  p->next=insert;
  return head;
  }
 }
 LN *DeleteData(int i,LN *head)
 {
  LN *p,*q;
  ;
  cout<<"输入要删除的节点位置:";
  cin>>i;
  if(i>LinkListLength(head))
  {
   cout<<"该节点不存在,删除失败!"<<endl;
   return NULL;
  }

  else
  {
  q=head;
  while(q&&j<i)
  {
   p=q;
   q=q->next;
   j++;
  }

  p->next=q->next;
  free(q);
  return head;
  }
 }
 LN * AddDataToTail(char ch,LN *head)
 {
  LN *p,*add;
  p=head;
  while(p->next)
  {
   p=p->next;
  }
  add=(LN *)malloc(sizeof(LN));
  add->data=ch;
  p->next=add;
  add->next=NULL;
  return head;
 }
 LN * PrintLinkList(LN *head)
 {
  LN *p;
  p=head->next;
  if(p==NULL)
  {
   cout<<"空链表无法打印!"<<endl;
   return NULL;
  }
  else
  {
  while(p->next)
  {
   cout<<p->data<<"-->";
   p=p->next;
  }
  cout<<p->data<<endl;
  return head;
  }
 }
 LN * FindMin(LN * head)
 {
  LN *p,*minptr;
  char min;
  p=head->next;
  minptr=p;
  min=minptr->data;
  while(p!=NULL)
  {
   if(p->data<min)
   {
    minptr=p;
    min=p->data;
   }
   p=p->next;
  }
  return minptr;
 }
 LN * DeleteSpecificData(char ch,LN * head)
 {
  LN *p,*q;
  ;
  q=head->next;
  p=head;
  while(q&&q->data!=ch)
  {
   p=q;
   q=q->next;
  }
  if(q==NULL)
  {
   cout<<"数据不存在,删除失败!"<<endl;
   return NULL;
  }
  else
  {
  p->next=q->next;
  free(q);
  return head;
  }
 }
 LN * ReverseLinkList(LN * head)
 {
  LN *p,*q,*pr;
  p=head->next;
  q=NULL;
  head->next=NULL;
  while(p)
  {
   pr=p->next;
   p->next=q;
   q=p;
   p=pr;
  }
  head->next=q;
  return head;
 }
 /*
 LN *OrderLinkList(LN *head)//链表排序法1
 {
  LN *ptn,*p,*minptr,*head1;
  ptn=(LN *)malloc(sizeof(LN));
  ptn->next=NULL;
  head1=ptn;
  p=head1;
  while(LinkListLength(head)!=0)
  {
   minptr=FindMin(head);
   ptn=(LN *)malloc(sizeof(LN));
   ptn->data=minptr->data;
   ptn->next=NULL;
   if(LinkListLength(head)==1)
   {
    p->next=ptn;
    DeleteSpecificData(minptr->data,head);
        p=p->next;
    free(head);
    break;
   }
   p->next=ptn;
   DeleteSpecificData(minptr->data,head);
   p=p->next;
  }
  return head1;
 }
 */
 LN * OrderLinkList(LN *head)//链表排序法2(冒泡法排序)
 {
  LN *p,*pr;
  char temp;
  p=head->next;
  while(p->next)
  {
   pr=p->next;
   while(pr)
   {
    if(pr->data<p->data)
    {
     temp=p->data;
     p->data=pr->data;
     pr->data=temp;
    }
    pr=pr->next;
   }
   p=p->next;
  }
  return head;
 }
 LN *Clear(LN * head)//清除重复数据
 {
  LN *q,*p,*ptn;
  q=head->next;
  if(q->next==NULL)//链表只有1个数据则直接返回头结点
  {
   return head;
  }
  else//链表含有2个或以上数据则进行以下操作
  {
  p=q->next;

  while(p)
  {
   if(q->data!=p->data)
   {
    q=q->next;
    q->data=p->data;
   }
   p=p->next;
  }
  ptn=q->next;
  while(ptn)
  {
   p=ptn;
   ptn=ptn->next;
   free(p);
  }
  q->next=NULL;
  return head;
  }
 }
 LN *EmptyLinkList(LN * head)//(清空)释放除头节点外的所有节点,释放后仍可以进行链表的各种操作
 {
  LN *p,*q;
  p=head->next;
  head->next=NULL;
  while(p)
  {
   q=p;
   p=p->next;
   free(q);
  }
  return head;
 }
 void DestroyLinkList(LN *head)//(销毁)链表不再存在,释放了所有节点
 {
  EmptyLinkList(head);
  free(head);
 }

 LN *GetTogether(LN *head,LN *head1)//将一个链表中数据全部追加到另一个链表尾部
 {
  LN *p1;
  p1=head1->next;
  while(p1)
  {
   AddDataToTail(p1->data,head);
   p1=p1->next;
  }
  DestroyLinkList(head1);
  return head;
 }

 int main()
 {
  ;
  int choice;
  char ch;
  LN *head,*head1,*result;
  head=CreateLinkList();
  if(head->next!=NULL)
  {
   cout<<"单链表head创建成功!"<<endl;
  }
  else
  {
   cout<<"创建了空链表head!"<<endl;
  }
  )
  {
      system("pause");
   system("cls");
  cout<<"1.查找指定节点数据"<<endl;
  cout<<"2.查找指定数据"<<endl;
  cout<<"3.查找最小数据"<<endl;
  cout<<"4.插入数据"<<endl;
  cout<<"5.追加数据"<<endl;
  cout<<"6.删除指定节点数据"<<endl;
  cout<<"7.删除指定数据"<<endl;
  cout<<"8.链表反转"<<endl;
  cout<<"9.链表排序(非递减)"<<endl;
  cout<<"10.合并两个链表(非递减)"<<endl;
  cout<<"11.链表长度"<<endl;
  cout<<"12.打印链表"<<endl;
  cout<<"13.清空链表"<<endl;
  cout<<"14.清除重复数据"<<endl;
  cout<<"0.退出程序"<<endl;
  cout<<"请选择操作:";
  cin>>choice;
  switch(choice)
  {
  : SearchData(n,head);break;
  :cout<<"输入待查找数据:";cin>>ch;SearchSpecificData(ch,head);break;
  :result=FindMin(head);cout<<"最小数据:"<<result->data<<endl;break;
  : result=InsertData(n,head);
   if(result)
   {
          cout<<"数据插入成功!"<<endl;
   }break;
  : cout<<"输入要追加的数据:"<<endl;cin>>ch;AddDataToTail(ch,head);cout<<"数据追加成功!"<<endl;break;
  : result=DeleteData(n,head);
   if(result)
   {
    cout<<"数据删除成功!"<<endl;
   }break;
   :cout<<"输入要删除的数据:"<<endl;cin>>ch;result=DeleteSpecificData(ch,head);
   if(result)
   {
    cout<<"该数据删除成功!"<<endl;
   }break;
  :cout<<"反转后链表为:";result=ReverseLinkList(head);PrintLinkList(result);break;
  :cout<<"链表按非递减排列:";result=OrderLinkList(head);PrintLinkList(result);break;
  :cin.get();head1=CreateLinkList();
   if(head1->next!=NULL)
  {
   cout<<"单链表head1创建成功!"<<endl;
  }
  else
  {
   cout<<"创建了空链表head1!"<<endl;
  }
  head=GetTogether(head,head1);
  head=OrderLinkList(head);if(head->next){cout<<"合并后链表为:";}
  PrintLinkList(head);break;
  : cout<<"链表长度为:"<<LinkListLength(head)<<endl;break;
  :if(head->next){cout<<"链表为:";}PrintLinkList(head);break;
  :head=EmptyLinkList(head);cout<<"链表已清空!"<<endl;break;
  :head=Clear(head);cout<<"重复数据已清除!"<<endl;break;
  :DestroyLinkList(head);exit();
  default:cout<<"输入错误!"<<endl;break;
  }
  }
  ;
 }

若有不足欢迎指正;若有疑问鄙人也乐于解答,欢迎留言或QQ加群!

欢迎加入QQ群:735472015,群内有VC,MFC,win32API,批处理,python学习资料干货喔

含头结点的单链表C++实现(包含创建,查找,插入,追加,删除,反转,排序,合并,打印,清空,销毁等基本操作)的更多相关文章

  1. 循环单链表定义初始化及创建(C语言)

    #include <stdio.h> #include <stdlib.h> /** * 含头节点循环单链表定义,初始化 及创建 */ #define OK 1; #defin ...

  2. 无头结点的单链表(C语言)

    1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的, ...

  3. java编写带头结点的单链表

    最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...

  4. C/C++中创建(带头结点、不带头结点的)单链表

    1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ ...

  5. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

  6. 不带头结点的单链表(基于c语言)

    本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ...

  7. 链表习题(2)-一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点。

    /*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍 ...

  8. 链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

    /*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...

  9. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

随机推荐

  1. win7 远程连接服务器出现身份验证错误,且找不到加密Oracle修正

    用远程桌面连接登录服务器,结果,弹出一个错误的提示框:发生身份验证错误,要求的函数不受支持. 然后在网上找了相关的教程,基本上所有的方法都是如下所示: 策略路径:"计算机配置"-& ...

  2. 常用到的简单命令 Sublime Git NPM WindowsCMD MacTerminal(Unix命令) Vim

    sublime 选择标签及其内容 ctrl+shift+a连续按两次 调出Package console: Mac: command + shift + p 安装插件: 1.调出 Package co ...

  3. 如何在windowserver2012 r2服务器AD域控制器中创建一个域管理员帐号

    用户创建完毕之后,需要添加一下权限才能实现域管理员账户的相关功能

  4. 创建 In-app Billing 商品

    创建可供购买的 In-app Billing 商品 在你发布 In-app Billing 应用前,你需要在 Google Play 开发者控制台 定义可供购买的数字商品列表. 在 Google Pl ...

  5. .htaccess详解及.htaccess参数说明

    .htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到 ...

  6. svn使用教程及常见问题解决方案

    使用教程转自:http://www.cnblogs.com/armyfai/p/3985660.html SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本 ...

  7. java继承-final关键词用法

    final关键字特点: 1.可以用来修饰变量.方法.类. 2.修饰的变量是一个常量.一旦被赋值就不能被修改(常量一般都和static关键字配合使用) 3.修饰类代表此类不能被继承4.修饰方法代表次方法 ...

  8. echarts柱状图,改变柱状颜色

    在使用echarts产生的柱状图中,有时候自动产生的颜色大不如人意,可以通过以下参数进行修改. series : [ { name:'天数', type:'bar', stack: '天', data ...

  9. BZOJ4653:[NOI2016]区间(线段树)

    Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x ...

  10. 【bzoj2154】Crash的数字表格 莫比乌斯反演

    题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, ...