线性表,顺序表,单链表

来源:互联网 发布:年会抽奖软件免费版 编辑:程序博客网 时间:2024/06/07 03:42

线性表的定义

    定义n个数据元素的有限序列,记作(a1, a2, …, an)ai 是表中数据元素,n 是表长度

线性表的特点

    除第一个元素外,其他每一个元素有一个且仅有一个

   直接前驱。

    除最后一个元素外其他每一个元素有一个且仅有一个

   直接后继。

 

顺序表的定义和特点

 定义  将线性表中的元素相继存放在一个连续的存储空间中。          

可利用一维数组描述存储结构

 特点   线性表的顺序存储方式

 遍历   顺序访问, 可以随机存取   

 

 

 

单链表的定义

typedef char ListData;

typedef struct node {             //链表结点   

   ListData     data;              //结点数据域

   struct node   * link;            //结点链域

} ListNode;

typedef ListNode * LinkList;  

LinkList first;                           //链表头指针

      

插入

第一种情况:在第一个结点前插入

           newnode->link= first ;   

              first = newnode;

 

第二种情况:在链表中间插入

       

       newnode->link = p->link;

              p->link = newnode;

 

 

 

int Insert (LinkList& first, int x,int i ) {

//在链表第 i 个结点处插入新元素x

   ListNode * p = first;   int k= 0;

   while (p != NULL && k< i -1  )

      { p = p->linkk++;}      //找第i-1个结点

   if ( p == NULL &&first != NULL ){  

        printf ( “无效的插入位置!\n” );

       return 0;

   }

   ListNode * newnode =            //创建新结点

       (ListNode *) malloc ( sizeof (ListNode) );

    newnode->data = x;

     if ( first == NULL || i ==1 ){  //插在表前

        newnode->link = first;                     

        first = newnode;

     }

     else {                              //插在表中或末尾

        newnode->link = p->link;

        p->link = newnode;

     }

     return 1;                                                    

 }

 

删除

第一种情况: 删除表中第一个元素

第二种情况: 删除表中或表尾元素

int Delete (LinkList& first,  int i){

//在链表中删除第 i 个结点

   ListNode *p, *q;

   if ( i == 1 )             //删除表中第 1个结点

      { q = first;  first = first->link; }

   else {

      p = first;  int k = 0;       //找第i-1个结点

      while ( p != NULL && k < i-1 )

         { p = p->link; k++; }

       if ( p == NULL || p->link ==NULL ) {

           printf ( 无效的删除位置!\n” );

            return 0;

        }

       else {                //删除表中或表尾元素

           q = p->link;       //重新链接

           p->link = q->link;       

       }

   }

   free ( q );           //删除q

    return1;                     

}

表头结点位于表的最前端,本身不带数据,仅标志表头。

设置表头结点的目的是

统一空表与非空表的操作

简化链表操作的实现。

前插法建立单链表

从一个空表开始,重复读入数据:

生成新结点

将读入数据存放到新结点的数据域中

将该新结点插入到链表的前端

直到读入结束符为止。

LinkList createListF ( void ) {

    char ch;   ListNode *s;

   LinkList  head =              //建立表头结点

       (LinkList) malloc (sizeof (ListNode));

   head->link = NULL;

   while ( (ch = getchar( ) ) != ‘\n’ ) {

        s = (listNode *) malloc (sizeof(ListNode));

        s->data = ch;              //建立新结点

        s->link = head->link; //插入到表前端

        head->link = s;

    }

    returnhead;

}   

 

后插法建立单链表

每次将新结点加在链表的表尾;

设置一个尾指针 r,总是指向表中最后一个结点,新结点插在它的后面;

尾指针 r 初始时置为指向表头结点地址。

LinkList createListR ( void ) {

   char ch;   

   LinkList  head =        //建立表头结点

       (LinkList) malloc (sizeof (ListNode));

   ListNode *s, *r = head;  // r指向表尾

   while ( (ch = getchar( ) ) != ‘\n’ ) {

        s = (listNode *) malloc (sizeof(ListNode));

        s->data = ch;            //建立新结点

        r ->link = s;   r = s;    //插入到表末端

    }

    r->link = NULL;          //表收尾    

   return head;}

 

 

单链表清空

void makeEmpty ( LinkList first ) {

//删去链表中除表头结点外的所有其他结点

   ListNode *q;

   while ( first->link != NULL ) {

            q = first->link;  first->link= q->link;               

       //将表头结点后第一个结点从链中摘下

              free( q );        //释放它

   }   

}

 

 

计算单链表长度

int Length (LinkList first ) {

    ListNode *p = first->link;

    //检测指针p 指示第一个结点

    int count = 0;

     while( p != NULL ) {      //逐个结点检测

         p = p->link;  count++;

    }                       

     returncount;

}

 

 

在单链表中按值查找

ListNode* Find ( LinkList first,ListDatavalue) {

//在链表中从头搜索其数据值为value的结点

    ListNode * p = first->link;

     //检测指针 p 指示第一个结点

    while ( p != NULL && p->data!= value ) 

        p = p->link;

     returnp;    

}

 

在单链表中插入新结点

int Insert (LinkList first, ListData x, inti ) {

//将新元素 x 插入在链表中第 i 号结点位置

   ListNode * p = Locate ( first, i-1 );

   if ( p == NULL ) return 0;  //不插入

   ListNode * newnode =             //创建新结点

       (ListNode *) malloc (sizeof (ListNode) );

   newnode->data = x; 

   newnode->link = p->link;      //链入

    p->link= newnode;

   return 1;       //插入成功,函数返回1

}

 

在单链表中删除一个结点

int delete ( LinkList first, int i ) {

//将链表第 i 号元素删去

   ListNode * p = Locate ( first, i-1 );

   //寻找被删结点的前驱结点

   if ( p == NULL || p->link == NULL)

       return 0;                        //不删除

   ListNode * q = p->link;         //被删结点地址

    p->link= q->link;                    //摘下被删结点

   free ( q );                        //释放

   return l;

}

int delete ( LinkList first, int i ) {

//将链表第 i 号元素删去

   ListNode * p = Locate ( first, i-1 );

   //寻找被删结点的前驱结点

   if ( p == NULL || p->link == NULL)

       return 0;                        //不删除

   ListNode * q = p->link;         //被删结点地址

    p->link= q->link;                    //摘下被删结点

   free ( q );                        //释放

   return l;

}

0 0