单向循环链表
实质就是把链的最后一个节点指向 头注意 区分 单向循环链表,和 双向循环链表思想: 利用带头节点的构造的循环链表, 先初始化一个环;linklist *Initlinklist() ///初始化循环链表{linklist *L;L=(linklist*)malloc(sizeof(linklist));L->next=L;///将链的最后指向头,形成环}最后添加节点,实质就是插入节点。#in
实质就是把链的最后一个节点指向 头
注意 区分 单向循环链表,和 双向循环链表
思想: 利用带头节点的构造的循环链表, 先初始化一个环;
linklist *Initlinklist() ///初始化循环链表
{
linklist *L;
L=(linklist*)malloc(sizeof(linklist));
L->next=L;///将链的最后指向头,形成环
}
最后添加节点,实质就是插入节点。
#include<iostream>
#include<cstdio>
using namespace std;
typedef struct node///单向循环链表
{
int data;
struct node *next;
}linklist;
linklist *Initlinklist() ///初始化循环链表
{
linklist *L;
L=(linklist*)malloc(sizeof(linklist));
L->next=L;///将链的最后指向头,形成环
}
void Insert(linklist *head,int x,int i)///在 第 i 个元素后插入 X
{
linklist*s,*p;
int j;
s=(linklist*)malloc(sizeof(linklist));
s->data=x;
p=head;
j=0;
while(p!=NULL&&(j<i))
{
p=p->next;
j++;
}
if(i==j)
{
s->next=p->next;
p->next=s;
}
else
cout<<"error"<<endl;
}
void Delete_linklist(linklist * head,int i)///删除指定位置的元素, i 后插入
{
linklist *p;
int j=0;
while((j<i)&&head!=NULL)
{
j++;
head=head->next;
}
if(i==j)
{
p=head->next;
head->next=p->next;
free(p);///释放需要删除的节点
}
else
cout<<"error"<<endl;
}
void Display(linklist *t,int n)///打印
{
int j=0;
while(t->next!=NULL&&(j<n))
{
cout<<t->next->data<<" ";
t=t->next;
j++;
}
cout<<endl;
}
int Length(linklist *head){///计算长度
int i=0;
linklist *p;
p=head->next;
while(p!=head)
{
i++;
p=p->next;
}
return i;
}
linklist *Search(linklist *head,int X){///查找值为X 的节点
linklist*p;
p=(linklist*)malloc(sizeof(linklist));
p->data=X;
int i=Length(head);
int j=0;
while(head!=NULL&&j<i&&head->data!=p->data) head=head->next;
if(j<=i)
return head;
else return NULL;
}
int main()
{
linklist *t=Initlinklist();
int i,j,m,n;
cin>>n;///构建 N 个数的循环链表
for(i=0; i<n; i++)
Insert(t,i,i);
cin>>m;
Delete_linklist(t,m);///删除 m
n--;
Display(t,n);///打印函数
linklist *s=Search(t,15);///查找值为 15 的节点
cout<<s->data<<endl;
return 0;
}
更多推荐