링크 - 링크 저장 소

7517 단어 데이터 구조
링크 의 선형 저장 소
//
//  main.c
//     -    
//


#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20

typedef int Status;
typedef int ElemType;


Status visit(ElemType c)
{
    printf("%d ",c);
    return OK;
}

//        ,          
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;

typedef struct Node *LinkList;//  LinkList   Node   

//   
Status InitList(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(Node));//     sizeof(Node)       ,     *L 
    if(!(*L))
        return ERROR;
    (*L)->next=NULL;//L   LinkList   ,(*L)    LinkList  ,       Node   
    
    return OK;
}


Status ListEmpty(LinkList L)
{
    if(L->next)
        return FALSE;
    else
        return TRUE;
}


Status ClearList(LinkList *L)
{
    LinkList p,q;
    p=(*L)->next;
    while(p)
    {
        q=p->next;
        free(p);
        p=q;
    }
    (*L)->next=NULL;
    return OK;
}

//      ,      
int ListLength(LinkList L)
{
    int i=0;
    LinkList p=L->next;//  L LinkList  ,  Node   ,p         
    while(p)
    {
        i++;
        p=p->next;
    }
    return i;
}


Status GetElem(LinkList L,int i,ElemType *e)
{
    int j;
    LinkList p;
    p = L->next;
    j = 1;
    while (p && jnext;
        ++j;
    }
    if ( !p || j>i )
        return ERROR;
    *e = p->data;
    return OK;
}

//     e       
int LocateElem(LinkList L,ElemType e)
{
    int i=0;
    LinkList p=L->next;
    while(p)
    {
        i++;
        if(p->data==e)
            return i;
        p=p->next;
    }
    
    return 0;
}


//     i         e   
Status ListInsert(LinkList *L,int i,ElemType e)
{
    int j;
    LinkList p,s;//p,s     Node        
    p = *L;
    j = 1;
    //   i   
    while (p && j < i)
    {
        p = p->next;
        ++j;
    }
    if (!p || j > i)
        return ERROR;   /*       i   ,   */
    s = (LinkList)malloc(sizeof(Node));  /*      Node   */
    s->data = e;
    s->next = p->next;      /*        next   i+1    */
    p->next = s;          /*   i    next        */
    return OK;
}

/*       i   ,    i     */
Status ListDelete(LinkList *L,int i,ElemType *e)
{
    int j;
    LinkList p,q;
    p = *L;
    j = 1;
    while (p->next && j < i)	/*    i-1   p */
    {
        p = p->next;
        ++j;
    }
    if (!(p->next) || j > i)
        return ERROR;           /*      i      */
    q = p->next;
    p->next = q->next;			/*  i-1    next   i+1    */
    *e = q->data;               /*   i       e*/
    free(q);                    /*    i       */
    return OK;
}


/*              */
Status ListTraverse(LinkList L)
{
    LinkList p=L->next;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    printf("
"); return OK; } // , , void CreateListHead(LinkList *L, int n) { LinkList p; int i; srand(time(0));// *L = (LinkList)malloc(sizeof(Node));// (*L)->next = NULL; for (i=0; idata = rand()%100+1; p->next = (*L)->next;// (*L)->next = p; } } // , void CreateListTail(LinkList *L, int n) { LinkList p,r; int i; srand(time(0)); /* */ *L = (LinkList)malloc(sizeof(Node)); /* */ r=*L; /* r */ for (i=0; idata = rand()%100+1; r->next=p; /* */ r = p; /* r */ } r->next = NULL; /* */ } int main() { LinkList L;//L ElemType e; Status i; int j,k; i=InitList(&L); printf(" ListLength(L)=%d
",ListLength(L)); for(j=1;j<=5;j++) i=ListInsert(&L,1,j); printf(" 1~5 L.data="); ListTraverse(L); printf("ListLength(L)=%d
",ListLength(L)); i=ListEmpty(L); printf("L i=%d(1:   0: )
",i); i=ClearList(&L); printf(" ListLength(L)=%d
",ListLength(L)); i=ListEmpty(L); printf("L i=%d(1:   0: )
",i); for(j=1;j<=10;j++) ListInsert(&L,j,j); printf(" 1~10 L.data="); ListTraverse(L); printf("ListLength(L)=%d
",ListLength(L)); ListInsert(&L,1,0); printf(" 0 L.data="); ListTraverse(L); printf("ListLength(L)=%d
",ListLength(L)); GetElem(L,5,&e); printf(" %d
",e); for(j=3;j<=4;j++) { k=LocateElem(L,j);// L , j , k if(k) printf(" %d %d
",k,j); else printf(" %d ",j); } k=ListLength(L); /* */ for(j=k+1;j>=k;j--) { i=ListDelete(&L,j,&e);/* j , j */ if(i==ERROR) printf(" %d
",j); else printf(" %d %d
",j,e); } printf(" L.data="); ListTraverse(L); j=5; ListDelete(&L,j,&e); /* 5 , */ printf(" %d %d
",j,e); printf(" L.data="); ListTraverse(L); i=ClearList(&L); printf(" ListLength(L)=%d
",ListLength(L)); CreateListHead(&L,20); printf(" L.data="); ListTraverse(L); i=ClearList(&L); printf(" ListLength(L)=%d
",ListLength(L)); CreateListTail(&L,20); printf(" L.data="); ListTraverse(L); return 0; }

실행 결과:
         ListLength(L)=0
   1~5     L.data=5 4 3 2 1 
ListLength(L)=5 
L    i=0(1:   0: )
   ListLength(L)=0
L    i=1(1:   0: )
 1~10      L.data=1 2 3 4 5 6 7 8 9 10 
ListLength(L)=10 
 0            L.data=0 1 2 3 4 5 6 7 8 9 10 
ListLength(L)=11 
           4
    4      3
    5      4
    12   
 11      10
      L.data=0 1 2 3 4 5 6 7 8 9 
   5     4
      L.data=0 1 2 3 5 6 7 8 9 
     ListLength(L)=0
       L.data=3 82 59 18 62 3 84 91 75 71 92 55 63 51 57 12 18 28 16 78 
     ListLength(L)=0
       L.data=78 16 28 18 12 57 51 63 55 92 71 75 91 84 3 62 18 59 82 3 
Program ended with exit code: 0

상기 프로그램 에 서 는 함수 Create List Tail 과 Create List Head 에 함수 stand (time (0) 를 사 용 했 습 니 다.
rand () 함수 가 발생 하 는 것 은 '위조' 임 의 수 입 니 다. 소프트웨어 로 m 시퀀스 발생 기 를 만들어 출력 합 니 다.이 m 시퀀스 발생 기 는 초기 상태 가 변 하지 않 는 경우 에 도 발생 하 는 '시퀀스' 는 같다. 예 를 들 어 특정한 상태 (예 를 들 어 0000...) 에서 발생 하 는 시퀀스 는 1, 2, 3, 4, 5, 3, 5, 1, 6 이다. 그러면 다음 에 0000... 의 초기 상태 에서 발생 하 는 시퀀스 는 1, 2, 3, 4, 5, 3, 5, 1, 6 이다. 그러나 초기 상태 가 다 르 면...발생 하 는 서열 이 다르다.우리 가 얻 은 '위조' 랜 덤 수 를 '진짜' 랜 덤 수 처럼 만 들 기 위해 서, 우 리 는 매번 rand () 함 수 를 호출 하기 전의 초기 상태 가 변화 하 기 를 희망 합 니 다.이 를 위해 C 는 srand () 함 수 를 설 계 했 습 니 다. m 시퀀스 발생 기의 초기 상 태 를 미리 설정 하고 수시로 가 변 적 인 시간 함수 의 반환 값 으로 srand () 를 호출 합 니 다. 그러면 미리 설 치 된 초기 상 태 는 시간 에 따라 변화 합 니 다. 이렇게 발생 하 는 m 시퀀스 는 '위조' 임 에 도 불구 하고 가짜 로 진실 을 어 지 럽 히 는 효과 가 있 습 니 다.

좋은 웹페이지 즐겨찾기