数据结构—环状链表瞎搞

来源:互联网 发布:akgy50淘宝哪家是真货 编辑:程序博客网 时间:2024/05/16 00:59

有这么一个题目,有M个人站成一个圆圈,每个人手持一个数字,然后每个人将自己手上的数字与相邻两位的数字相加后得到一个数据N,然后求在N[M]中求出最小值。(要求要用链表实现)

开始看到这个题,可能会想到用一个双向链表很容易解决问题,可能情况也可能是,但本人花了点时间,用一个环状链表解决了这个问题。

什么是环状链表呢?一般的链表的尾指针都指向一个NULL,而环状链表指向将普通链表的尾指针指向头节点即可实现,下面是本人的具体实现。

 1、创建工程:cyclicLinklist

 2、新建链表:myHeader.h

#define STR_LEN 10

typedef struct linkNode
    {
    int data;
    struct linkNode *next;
   
   }linklist;

linklist *create();
   int minThreeConnData(linklist *L);
   linklist *insertData(linklist *L,int data);
   void printLink(linklist *L);

3、方法的实现:myHeader.c

#include
#include "myHeader.h"
#include
linklist *create(int *a,int len)
{
   
    linklist *head,*fore,*current;// *head保存表头结点的指针,*fore指向当前结点的前一个结点,*current指向当前结点
    int i=1;
    head=(linklist *)malloc(sizeof(linklist));
    if(!(head))
    {
        printf("分配内存失败!");
        exit(0);
    }
    head->data=a[0];
    head->next=NULL;
    fore=head;
    while (i
        current=(linklist*)malloc(sizeof(linklist));
        if (!current)
        {
            printf("分配内存失败!");
            exit(0);
        }
        fore->next=current;
        current->data=a[i];
        i++;
        current->next=NULL;
        fore=current;
    }
    fore->next=head;//让尾指针指向头节点,实现环状链表
    return(head);//返回表头结点的指针
}
//在链表头部插入新值
linklist *insertData(linklist *L,int data)
{
    linklist *q=L->next;
 linklist *rear=q;
    linklist *newList=(linklist *)malloc(sizeof(linklist));
 
 //找到尾指针
 while(!(q==L))
 {
  rear=q;
  q=q->next;
 }

 newList->data=data;
 rear->next=newList;
    newList->next=L;
    return newList;
   
}
int minThreeConnData(linklist *l)
{
   
    int min=0;
    int flag=1;
    linklist *s=l;
    do {
        int temp=s->data;
        int temp1=s->next->data;
        int temp2=s->next->next->data;
        int temp3=temp+temp1+temp2;
        printf("%d+%d+%d=%d\n",temp,temp1,temp2,temp3);
        printf("data:%d\n",s->data);
        if (flag==1) {
            min=temp3;
            flag=0;
        }
        else
        {
            if (temp3
            {
                min=temp3;
            }
        }
       
    }
    while (!((s=s->next)==l));
    return min;
}


void printLink(linklist *L)
{
 linklist *p=L;
 if(p==p->next)
 {
  printf("当前链表还没有数据!");
  exit(0);
 }
 do
 {
  printf("%d ",p->data);
  p=p->next;
 }
 while(!(p==L));
 printf("\n");
}

4、测试:main.c

#include
#include "myHeader.h"
#define  ARRAY_LEN 4
int main(int argc, const char * argv[])
{
    int array[ARRAY_LEN]={0,5,2,3};
    linklist *L;
    L=create(array,ARRAY_LEN);
    L=insertData(L,4);
 printLink(L);
    printf("%d",minThreeConnData(L));
}

原创粉丝点击