程序对数据的表示,不但要求存放基本信息,还要表示与其它数据元素的关系
线性表是最简单的数据组织形式
1 #include <iostream> 2 using namespace std; 3 4 //用插入法生成一个有序的链表和约瑟夫问题 5 6 //声明结构类型,结构指针变量 7 struct list{ 8 int data; 9 list* next; 10 }; 11 //头指针是全局变量 12 list* head; 13 14 //插入结点函数,返回类型为结构指针(链表头指针) 15 list* myInsert(int num){ 16 bool isHave = true; 17 //声明局部指针变量 18 list *p,*q,*s; 19 //生成新结点 20 s=new list(); 21 s->data=num; 22 s->next=NULL; 23 24 //如果头结点为空的话,生成链表的第一个结点即头结点 25 if(head == NULL){ 26 head = s; 27 return head; 28 }else if(head->data>s->data){ 29 s->next = head; 30 head = s; 31 return head; //此时num是最小值,所以把num插入头结点之前 32 }else if(isHave){ 33 for(q = head,p = head->next;p;q = p,p = p->next){ 34 if(p->data > s->data){ 35 s->next = p; 36 q->next = s; 37 return head; //如果找到第一个比num大的结点*p,则把num插到*p之前 38 } 39 } 40 } 41 //如果上边的条件都不满足的话,说明num为最大值,将num插到表尾; 42 q->next = s; 43 return head; 44 } 45 46 //删除结点函数,如果调用此函数时,不传任何参数,则自动删除第一个结点。 47 void myDelete(int num=head->data){ 48 list *q,*p; 49 //判断所要删除的结点是不是头结点 50 if(head->data == num){ 51 list* t = head; //定义一个结点,让它指向头结点,主要用于删除以前的头结点 52 head = head->next; //让当前的头指向下一个节点。 53 delete t; //删除当前的节点 54 return; //如果删除成功,则没有必要再判断下边的语句,所以函数返回, 55 }else{ 56 //让节点q指向第一个头结点,p指向q下一个的结点,主要用于搜索我们指定的结点 57 //判断条件p为搜索条件,即(p!=NULL) 58 for(q = head,p = head->next;p;q=p,p=p->next) 59 { 60 if(p->data == num){ 61 if(p->next == NULL){ 62 q->next=NULL; 63 delete p; 64 return; 65 }else{ 66 q->next = p->next; 67 delete p; 68 return; 69 } 70 } 71 } 72 } 73 } 74 75 void showList(const list *head){ 76 cout << "Now the items of list are:" << endl; 77 //主要用于打印链表的数据,打印完一个数据之后,让head结点移动到下一个结点 78 while(head){ 79 cout << head->data << " " ; 80 head = head->next; 81 } 82 cout << endl; 83 } 84 85 //生成有序链表 86 void main2(){ 87 int m ; 88 head = NULL; 89 cin>>m; 90 while(m!=0){ 91 head = myInsert(m); 92 cin >> m; 93 } 94 showList(head); 95 myDelete(); 96 showList(head); 97 } 98 99 //创建一个链环 100 list* create(int n){ 101 list *h,*p; 102 //建立第一个结点 103 h = new list(); 104 p = h; 105 for(int i=1;i<=n;i++){ 106 //向结点赋序号 107 p->data = i; 108 if(i<n){ 109 //在表尾建立新的结点 110 p->next = new list(); 111 p = p->next; 112 }else{ 113 p->next = h; //当创建最后一个结点时,把p->next设为头结点 114 } 115 } 116 return h; 117 } 118 119 void out(int interval,list *h){ 120 list *q,*p=h; 121 cout << " Joseph problem for the output of the order:" << endl; 122 //处理链环,指导剩下一个结点 123 while(p!=p->next){ 124 for(int i=1;i<interval;i++){ 125 //报数 126 q=p; 127 p=p->next; 128 } 129 //输出报到结点 130 cout << p->data << " "; 131 //删除结点 132 q->next = p->next; 133 delete p; 134 135 //移动节点 136 p = q->next; 137 } 138 //输出最后一个结点 139 cout << p->data<<endl; 140 } 141 142 //约瑟夫问题 143 void main(){ 144 int n; 145 int interval; 146 cout << "请输入人数:" ; 147 cin>> n; 148 cout << " 请输入间隔数:"; 149 cin>>interval; 150 out(interval,create(n)); 151 }