您的位置:首页 > 其它

1.1单链表

2015-09-25 16:58 351 查看
#include<iostream>
using namespace std;

typedef struct node
{
int data;
struct node *next;
}LNode,*LinkList;

//创建空单链表
LinkList Creat_LinkList(void)
{
LinkList H=(LinkList)malloc(sizeof(LNode));
if(H)               //确认头结点创建是否成功
{
H->next=NULL;
}
return H;
}
//销毁单链表
void Destroy_LinkList(LinkList *H)
{
LinkList p,q;
p=*H;
while(p!=p->next)
{
q=p;
p=p->next;
free(q);
}
free(p);
*H=NULL;
}
//求表长(循环链表求表长)
int Length_LinkList(LinkList H)
{
if(H->next==NULL)
return 0;
LinkList p=H->next;
LinkList q=H->next;
int count=1;
while(p->next!=q)
{
p=p->next;
count++;
}
return count;
}
//查找操作
//按序号查找
LinkList Locate_LinkList_Pos(LinkList H,int i)
{
//i不正确或链表不存在,则返回NULL,i==0返回头指针,否则返回第i个结点的指针
LinkList p;
int j;
p=H;
j=0;
while(p&&j<i)
{
p=p->next;
j++;
}
if(j!=i||!p)
{
cout<<"i不正确或链表不存在!";
return NULL;
}
return p;
}
//按值查找
LinkList Locate_LinkList_Value(LinkList H,int x)
{
//查找值为x的结点  返回其指针,否则返回NULL
LinkList p=H->next;
while(p&&H->data!=x)
{
p=p->next;
}
return p;
}
//插入
int Insert_LinkList(LinkList H,int x)
{

LinkList p,q;
p=(LinkList)malloc(sizeof(LNode));
if(!p)
{
cout<<"申请空间失败!";
return 0;
}

if(H->next==NULL)//当链表为空时,插入第一个元素
{
p->data=x;
H->next=p;
p->next=H->next;
}
else             //在头指针和最后一个元素之间插入
{
p->data=x;
q=H->next;
while(q->next!=H->next)
{
q=q->next;
}
q->next=p;
p->next=H->next;
}
return 1;
}
//删除
int Del_LinkList(LinkList H,int i)
{
//删除第i个结点
LinkList p,q;
if(H==NULL||H->next==NULL)
{
cout<<"链表不存在或空表不能删除!";
return 0;
}
p=Locate_LinkList_Pos(H,i-1);
if(p==NULL||p->next==NULL)
{
cout<<"i有误!";
return 0;
}
q=p->next;
p->next=q->next;
free(q);
return 1;
}

int josephus_LinkList(LinkList josephus_Link,int s,int m)
{
//入口参数为已存在的链表头指针,起始位置s,报数到m
LinkList p,pre;
int i;
if(!josephus_Link)
{
cout<<"表中无元素!";
return 0;
}
p=josephus_Link;
for(i=0;i<s;i++)
p=p->next;    //用p作为第s个结点指针(开始结点)
cout<<"输出约瑟夫序列:"<<endl;
while(p!=p->next)  //当不止一个元素时
{
for(i=1;i<m;i++)   //用p指向要删除的结点
{
pre=p;
p=p->next;
}
cout<<p->data<<" ";      //输出出列的元素
pre->next=p->next;
free(p);
p=pre->next;//从下一个开始循环
}
cout<<p->data<<" ";//输出最后一个元素
free(p);
return 1;
}

int main()
{
LinkList H=Creat_LinkList();//定义一个指针变量,指向创建的单链表,并初始化
LinkList p=H;
int i;
for(i=0;i<10;i++)
{
Insert_LinkList(H,i);
}
for(i=0;i<12;i++)
{
p=p->next;
cout<<p->data;
}
cout<<endl;
//cout<<Length_LinkList(H)<<endl;
//josephus_LinkList(H,1,2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: