数据结构--线性表链式存储

线性表&顺序表

单向链表要删除某一节点时,必须要先通过遍历的方式找到前驱节点(通过待删除节点序号或按值查找)。若仅仅知道待删除节点,是不能知道前驱节点的,故单链表的增删操作复杂度为O(n)。 双链表(双向链表)知道要删除某一节点p时,获取其前驱节点q的方式为 q = p->prior,不必再进行遍历。故时间复杂度为O(1)。而若只知道待删除节点的序号,则依然要按序查找,时间复杂度仍为O(n)。

用顺序存储方法存储的线性表简称为顺序表

顺序表的类型定义

#define ListSize 800 //表空间的大小可根据实际需要而定,这里假设为800

typedef int DataType; //DataType的类型可根据实际情况而定,这里假设为int

typedef struct {

DataType data[ListSize];//向量data用于存放表结点

int length;//当前的表长度

}SeqList;

//创建链表

Status CreateList(LinkList *L){

    intitem;

    LinkListtemp =NULL;

    LinkListtarget =NULL;

    printf("输入节点的值,输入0结束\n");

    while(1)

    {

        scanf("%d",&item);

        if(item==0)break;


          //如果输入的链表是空。则创建一个新的节点,使其next指针指向自己  (*head)->next=*head;

        if(*L==NULL)

        {

            *L = (LinkList)malloc(sizeof(Node));

            if(!L)exit(0);

            (*L)->data=item;

            (*L)->next=*L;

        }

        else

        {

           //输入的链表不是空的,寻找链表的尾节点,使尾节点的next=新节点。新节点的next指向头节点


            for(target = *L; target->next!= *L; target = target->next);


            temp=(LinkList)malloc(sizeof(Node));


            if(!temp)returnERROR;


            temp->data=item;

            temp->next=*L;  //新节点指向头节点

            target->next=temp;//尾节点指向新节点

        }

    }

    return OK;

}

你可能感兴趣的:(数据结构--线性表链式存储)