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; }
相关文章推荐
- Android samples API Demos之UI篇3(AdvancedImmersiveMode)沉浸模式
- socket阻塞与非阻塞,同步与异步、I/O模型
- nginx location 语法
- 编码问题
- sql实现有数据就更新,没有就插入
- 通过sql语句查看MYSQL表占空间,数据库所占空间
- 多线程几种同步方式
- hpuoj 1701: 善良的国王【最小生成树】
- Uva 1225 - Digit Counting
- viewpager + fragmentpageradapter 切换fragment产生的问题
- Android Studio安装Genymotion插件
- C语言中结构体基本知识
- Mac中安装Vim7.4
- HDU 1180 诡异的楼梯(BFS,用优先队列过)
- delphi android Toast
- wampserver环境套装
- Java基础知识强化90:Date类之Data类中日期和毫秒相互转换
- Magicodes.WeiChat——自定义knockoutjs template、component实现微信自定义菜单
- 异常处理原则
- List,set,Map 的用法和区别等