含头结点的单链表C++实现(包含创建,查找,插入,追加,删除,反转,排序,合并,打印,清空,销毁等基本操作)
温馨提示:下面代码默认链表数据为字符型,本代码仅供参考,希望能对找到本随笔的人有所帮助!
#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学习资料干货喔
#include <stdio.h> #include <stdlib.h> /** * 含头节点循环单链表定义,初始化 及创建 */ #define OK 1; #defin ... 1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的, ... 最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ... 1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ ... 1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ... 本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ... /*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍 ... /*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ... 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ... URLConnection类常见的超时处理就是调用其setConnectTimeout和setReadTimeout方法: setConnectTimeout:设置连接主机超时(单位:毫秒) setR ... [下面是昨天发给同事的邮件,为防止泄露商业机密,隐去了项目名和变量名] ==================================================== 昨天发现Nx代码中的一 ... Exceptional Exception Handling in JavaScript MDN资料 Anything that can go wrong, will go wrong. ... 操作系统背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其 ... 如何递归执行view的动画 效果: 山寨的源头: 图片素材: 源码: // // ViewController.m // RepeatAnimationView // // Created by Yo ... 微软给了exchange owa页面加固的方案,如有需要,请查看. https://partnersupport.microsoft.com/zh-hans/par_servplat/forum/pa ... 正则表达式目标 正则表达式单字符: 特定字符 范围字符:单个字符[ ] :代表查找单个字符,括号内为字符范围 数字字符:[0-9],[259] 查找 0~9 和 2.5 .9 中的任意一个字符 小写字 ... Linux中脚本的使用方法 一.前言 关于Linux中的脚本的用法,一直没有时间去好好地总结,正好今天下雨,就好好的整理一下思路吧,其实精通了一门语言,比如C语言,学习其他语言需要的成本是非常少的,同 ... 从别处抄来一个代码 mode是:O_WRONLY 以只写方式打开文件 而实际上我用的是read操作,所以老是读出-1 检查了很久才发现是这个错误:O_WRONLY 以只写方式打开文件 -> O_ ... 第一章 课程介绍 python 特点:优雅.明确.简单 python适合的领域:1.Web网站和各种网络服务:2.系统工具和脚本:3.作为"胶水"语言把其他语言开发的模块包装起来方 ...含头结点的单链表C++实现(包含创建,查找,插入,追加,删除,反转,排序,合并,打印,清空,销毁等基本操作)的更多相关文章
随机推荐