/* 华科机试练手
* 生成一个长度为21的数组,依次存入1到21;
* 建立一个长度为21的单向链表,将上述数组中的数字依次存入链表每个结点中;
* 将上述链表变为单向封闭(循环)链表;
* 从头结点开始数,将第17个结点删除,将它的下一个结点作为新的头结点;
* 重复上述过程,直到该链表中只剩一个结点,显示该结点中存入的数字 */
#include <stdlib.h>
#include <stdio.h>
typedef struct _Node
{
int data;
struct _Node *next;
}Node;
Node* CreateList(int a[])
{
int i;
Node *p,*head,*newNode;
head = (Node *)malloc(sizeof(Node));
head->data = a[0];
head->next = NULL;
p = head;
for(i=1; i<21; i++)
{
newNode = (Node*)malloc(sizeof(Node));
newNode->data = -1;
newNode->next = NULL;
p->next = newNode;
p = p->next;
p->data = a[i];
}
return head;
}
void tranverse(Node * const head)
{
Node *p = head;
printf("%d\t",p->data);
p = p->next;
while(p && head!=p)
{
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
void CycleList(Node * const head)
{ //转换为循环表
Node *p = head;
while(p->next)p = p->next;
p->next = head;
}
void Delete(Node **head)
{
int i=1;
Node *p = *head, *pre=p;
while(1)
{
if(17 == i)
{
pre->next = p->next;
free(p);
*head = pre->next;
break;
}
pre = p;
p = p->next;
i++;
}
}
int main(int argc, char *argv[])
{
int a[21] = {0},i;
Node *head;
for(i=0; i<21; i++)a[i] = i+1;
head = CreateList(a);
tranverse(head);
CycleList(head);
tranverse(head);
printf("Deleting..\n");
for(i=1; i<21; i++)
{
Delete(&head);
tranverse(head);
}
printf("\n");
return 1;
}
/* 华科机试练手
* 给你一组数,让你求出其中一连续的子串,他们和值最大 */
#include <stdlib.h>
#include <stdio.h>
int Select(int a[],int n,int *s,int *e)
{
int i,j,max=0,sum=0;
*s = 0,*e = 0;
for(i=0; i<n; i++)
{
sum = a[i];
for(j=i+1; j<n; j++)
{
if(a[j-1]+1 != a[j])break;
sum += a[j];
}
if(sum > max)
{
max = sum ;
*s = i;
*e = j;
}
}
return max;
}
int main(int argc, char *argv[])
{
int a[] = {1,2,3,4,5,7,6,7,4,5,6,7},i;
int s=0, e=0;
printf("maxSum : %d\n",Select(a,12,&s,&e));
for(i=s; i<e; i++)printf("%d\t",a[i]);
printf("\n");
return 1;
}