建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
2013-10-06 16:43
1006 查看
// 建立一个带附加头结点的单链表/测长/打印
#include<iostream>
using namespace std;
typedef struct node
{
int data;
node *next;
}LinkList;
LinkList *creat()
{
LinkList *head,*p,*s;
int x;
head=new LinkList[sizeof(LinkList)];
head->data=0;
p=head;
while(1)
{
cout<<"Please input the data:"<<endl;
cin>>x;
if(x==0) break;
s=new LinkList[sizeof(LinkList)];
s->data=x;
p->next=s;
p=s;
}
p->next=NULL;
return head;
}
int length(LinkList *head)
{
int n=0;
LinkList *p;
p=head->next;
while(p!=NULL)
{
p=p->next;
n++;
}
return n;
}
void print(LinkList *head)
{
LinkList*p;
p=head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
/*LinkList *del(LinkList *head,int deldata)
{
LinkList *p1,*p2;
p1=head;
while(deldata != p1->data && p1->next != NULL)
{
p2=p1;
p1=p1->next;
}
if(deldata==p1->data)
{
if(p1==head)
{
head=p1->next;
free(p1);
}
else
p2->next=p1->next;
}
else
cout<<deldata<<"could not been found"<<endl;
return head;
}*/
LinkList *del(LinkList *head,int deldata)
{
LinkList *p1,*p2;
p1=head;
while(p1->next !=NULL)
{
p2=p1;
p1=p1->next;
if(deldata==p1->data)
{
p2->next=p1->next;
break;
}
}
if(p1->next ==NULL)
cout<<deldata<<" could not been found"<<endl;
return head;
}
LinkList *insert(LinkList *head,int num)
{
LinkList *p0,*p1,*p2;
p1=head;
p0=new LinkList[sizeof(LinkList)];
p0->data=num;
while(p1->next != NULL)
{
p2=p1;
p1=p1->next;
if(p0->data<p1->data)
{
p2->next=p0;
p0->next=p1;
break;
}
if(p0->data==p1->data)
{
cout<<"yao cha ru de yuan su yi jing cun zai"<<endl;
break;
}
}
if(p0->data>p1->data)
{
p1->next=p0;
p0->next=NULL;
}
return head;
}
LinkList *Reverse(LinkList *head)
{
LinkList *p1,*p2,*p3;
if(head==NULL||head->next==NULL)
return head;
p1=head;
p2=p1->next;
p3=p2->next;
p1->next=NULL;
while(p3)
{
p2->next=p1;
p1=p2;
p2=p3;
p3=p3->next;
}
p2->next=p1;
head=p2;
return head;
}
LinkList* searchmid(LinkList* head)
{
LinkList* mid=new LinkList[sizeof(LinkList)];
LinkList *p1=head->next;
LinkList *p2=p1;
while(p1->next != NULL && p1->next->next != NULL )
{
p1=p1->next->next;
p2=p2->next;
}
mid=p2;
return mid;
}
LinkList* finddaoshuk(LinkList* head,int k)
{
LinkList *p1=head->next;
LinkList *p2=p1;
for(int i=1;i<k;i++)
{
if(p1->next!=NULL)
p1=p1->next;
else return NULL;
}
while(p1->next!=NULL)
{
p1=p1->next;
p2=p2->next;
}
return p2;
}
bool IsCircle(LinkList* head)
{
LinkList *p1=head->next;
LinkList *p2=p1;
while(p1->next != NULL && p1->next->next != NULL )
{
p1=p1->next->next;
p2=p2->next;
if(p2==p1) return true;
}
return false;
}
int main()
{
LinkList*node=creat();
//cout<<length(node)<<endl;
print(node);
bool IsCir=IsCircle(node);
if(IsCir==true) cout<<"The list has circle"<<endl;
else cout<<"The list has not circle"<<endl;
/*LinkList* mid=searchmid(node);
cout<<mid->data<<endl;
cout<<"Please output dao shu di k ge jie dian"<<endl;
int k=2;
LinkList* pk=finddaoshuk(node,k);
if(pk==NULL) cout<<k<<" k is biger than the lengh of node";
else cout<<pk->data<<endl;*/
/* LinkList*afterdel=del(node,3);
print(afterdel);
LinkList*afterinsert=insert(node,10);
print(afterinsert);
cout<<"after reverse LinkList"<<endl;
LinkList*afterreverse=Reverse(afterinsert);
print(afterreverse);*/
return 0;
}
#include<iostream>
using namespace std;
typedef struct node
{
int data;
node *next;
}LinkList;
LinkList *creat()
{
LinkList *head,*p,*s;
int x;
head=new LinkList[sizeof(LinkList)];
head->data=0;
p=head;
while(1)
{
cout<<"Please input the data:"<<endl;
cin>>x;
if(x==0) break;
s=new LinkList[sizeof(LinkList)];
s->data=x;
p->next=s;
p=s;
}
p->next=NULL;
return head;
}
int length(LinkList *head)
{
int n=0;
LinkList *p;
p=head->next;
while(p!=NULL)
{
p=p->next;
n++;
}
return n;
}
void print(LinkList *head)
{
LinkList*p;
p=head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
/*LinkList *del(LinkList *head,int deldata)
{
LinkList *p1,*p2;
p1=head;
while(deldata != p1->data && p1->next != NULL)
{
p2=p1;
p1=p1->next;
}
if(deldata==p1->data)
{
if(p1==head)
{
head=p1->next;
free(p1);
}
else
p2->next=p1->next;
}
else
cout<<deldata<<"could not been found"<<endl;
return head;
}*/
LinkList *del(LinkList *head,int deldata)
{
LinkList *p1,*p2;
p1=head;
while(p1->next !=NULL)
{
p2=p1;
p1=p1->next;
if(deldata==p1->data)
{
p2->next=p1->next;
break;
}
}
if(p1->next ==NULL)
cout<<deldata<<" could not been found"<<endl;
return head;
}
LinkList *insert(LinkList *head,int num)
{
LinkList *p0,*p1,*p2;
p1=head;
p0=new LinkList[sizeof(LinkList)];
p0->data=num;
while(p1->next != NULL)
{
p2=p1;
p1=p1->next;
if(p0->data<p1->data)
{
p2->next=p0;
p0->next=p1;
break;
}
if(p0->data==p1->data)
{
cout<<"yao cha ru de yuan su yi jing cun zai"<<endl;
break;
}
}
if(p0->data>p1->data)
{
p1->next=p0;
p0->next=NULL;
}
return head;
}
LinkList *Reverse(LinkList *head)
{
LinkList *p1,*p2,*p3;
if(head==NULL||head->next==NULL)
return head;
p1=head;
p2=p1->next;
p3=p2->next;
p1->next=NULL;
while(p3)
{
p2->next=p1;
p1=p2;
p2=p3;
p3=p3->next;
}
p2->next=p1;
head=p2;
return head;
}
LinkList* searchmid(LinkList* head)
{
LinkList* mid=new LinkList[sizeof(LinkList)];
LinkList *p1=head->next;
LinkList *p2=p1;
while(p1->next != NULL && p1->next->next != NULL )
{
p1=p1->next->next;
p2=p2->next;
}
mid=p2;
return mid;
}
LinkList* finddaoshuk(LinkList* head,int k)
{
LinkList *p1=head->next;
LinkList *p2=p1;
for(int i=1;i<k;i++)
{
if(p1->next!=NULL)
p1=p1->next;
else return NULL;
}
while(p1->next!=NULL)
{
p1=p1->next;
p2=p2->next;
}
return p2;
}
bool IsCircle(LinkList* head)
{
LinkList *p1=head->next;
LinkList *p2=p1;
while(p1->next != NULL && p1->next->next != NULL )
{
p1=p1->next->next;
p2=p2->next;
if(p2==p1) return true;
}
return false;
}
int main()
{
LinkList*node=creat();
//cout<<length(node)<<endl;
print(node);
bool IsCir=IsCircle(node);
if(IsCir==true) cout<<"The list has circle"<<endl;
else cout<<"The list has not circle"<<endl;
/*LinkList* mid=searchmid(node);
cout<<mid->data<<endl;
cout<<"Please output dao shu di k ge jie dian"<<endl;
int k=2;
LinkList* pk=finddaoshuk(node,k);
if(pk==NULL) cout<<k<<" k is biger than the lengh of node";
else cout<<pk->data<<endl;*/
/* LinkList*afterdel=del(node,3);
print(afterdel);
LinkList*afterinsert=insert(node,10);
print(afterinsert);
cout<<"after reverse LinkList"<<endl;
LinkList*afterreverse=Reverse(afterinsert);
print(afterreverse);*/
return 0;
}
相关文章推荐
- 链表面试题逆序打印,删除无头非尾节点,非头位置插入,约瑟夫环,查找中间和倒数第k个节点
- 单链表的创建和遍历、求单链表中节点的个数、查找单链表中的中间结点、判断单链表是否有环、取出有环链表中环的长度,删除有序链表中的重复结点
- 队列用链表实现(建立,插入新元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空)
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
- 20140719 找到单链表的倒数第K个节点 判断一个链表是否成为一个环形 反转
- 编写一个程序,实现删除链表中倒数第k个节点(用单链表实现)
- 单链表的经典操作,查找链表倒数第k个节点,判断链表是否存在环,求环节点
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 链表倒数第k个结点、链表中间节点、链表是否有环
- 队列用链表实现(建立,插入新元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空)
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- 链表的初始化、遍历、删除、插入、判断是否为空、求长度 C语言实现
- 单链表的创建(头插尾插),表长,输出,插入,删除,查找,逆置,分解长两个链表(奇数偶数链表),查找倒数第k个元素,产出相同元素
- python实现单链表中删除倒数第K个节点的方法
- 链表:检测是否有环,是否相交,删除节点,插入节点,打印节点,建立节点,节点排序,节点逆序,
- 不带头结点的单链表的插入,删除,原地转置,判断空,清空,统计节点数目等操作
- 【算法之链表(一)】判断单链表中是否有环、环的长度、环的入口节点,单链表的倒数第K个节点等
- 实现双向链表删除一个节点P,在节点P后插入一个节点