The general form of the linear form

The general form of the linear form

Considering the sequence table has a number of advantages not linear list, for this purpose, from the viewpoint of practical use linear list redefining its basic operation.

Structure and general auxiliary statement

#include <stdio.h>
#include <stdlib.h>

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

typedef int Status;
typedef int ElemType;

typedef struct LNode{  /* 结点类型 */
    ElemType data;
    struct LNode *next;
} * Link, *Position, LNode;

typedef struct {    /* 链表类型 */
    Link head,tail; /* 分别指向链表中的头结点和最后一个结点 */
    int len;        /* 指示链表中的数据元素的个数 */
}LinkList;

/* 构造一个空的线性链表 */
Status InitList(LinkList *L)
{
    Link p = (Link)malloc(sizeof(LNode)); 
    if(!p)
        return ERROR;
    p->next = NULL;  /* 创建头结点 */

    L->head = p;
    L->tail = NULL;
    L->len = 0;
    return OK;
}

Status MakeNode(Link *p, ElemType e)
{
    *p = (Link)malloc(sizeof(LNode));
    if(!(*p))
        return ERROR;
    (*p)->data = e;
    (*p)->next = NULL;
    return OK;
}

/** 返回线性链表L中的第i个结点并返回OK 
 *  i值不合法时返回ERROR,i=0时返回头结点
 */
Status LocatePos(LinkList *L, int i, Link * t)
{
    Link p = (*L).head;    /* 从头结点开始 */
    int k = 0;
    while (p && k<i) {
        p = p->next;
        k++;
    }
    /* 验证第i个是否存在 */
    if(!p || k>i)
        return ERROR;
    *t = p;
    return OK;
}

Status InsFirst(LinkList *L, Link h, Link s)
{
    if(!s || !h)
        return ERROR;
    s->next = h->next;
    h->next = s;
    (*L).len++;
    return OK;
}

Status printList(LinkList L)
{
    Link p = L.head->next;
    while (p) {
        printf("%d ",p->data);
        p = p->next;
    }

    printf("\n");
    
}

Status ListInsert(LinkList *L, int i, ElemType e)
{
    Link p,s;
    if(!LocatePos(L,i-1,&p))
        return ERROR;
    if(!MakeNode(&s,e))
        return ERROR;
    InsFirst(L,p,s);
    return OK;
}

int main()
{
    LinkList L;
    InitList(&L);
    L.head->data = 555;
    ListInsert(&L,1,250);
    ListInsert(&L,2,500);
    ListInsert(&L,4,500);
    Link t;
    if(LocatePos(&L,2,&t))
        printf("t->data = %d\n",t->data);

    printList(L);
    printf("%d\n",L.len);

}

Guess you like

Origin www.cnblogs.com/wjundong/p/11622491.html