代码改变世界

面试题1:单链表的初始化、测长

2016-03-25 21:23  Keiven_LY  阅读(862)  评论(0编辑  收藏  举报

单链表结点的结构体表示

typedef struct node
{
    int data;
    struct node *next;
}Node, *LinkList;
/*         *********结构体定义的理解   ************     */
/*  这里的Node是结构体struct node的一个别名             */
/*  这里的*LinkList也是结构体struct node的一个别名      */
/*  换言之LinkList是结构体struct node类型的指针的别名   */
/*  也就是说struct node *p;这条语句等同于LinkList p;    */
/*  LinkList *L相当于struct node **L,是二级指针,如: 
    int i;
    int *pi = &i;  //这里定义了一个指向整型i的指针pi, &表示取地址符号
    int **ppi = π //ppi就是一个二级指针,其指向指针pi的地址
*/

单链表初始化的功能函数

/*         *********初始化单链表表   ************     */  
/*  初始化成功返回1,初始化失败返回0  */
int InitList(LinkList *L)   
{
*L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
/* 此处返回给L的是一个指针,并且赋给了头指针 */ 
    /*     *L其实就是头结点,L则为头指针        */
    if(!(*L)) /* 存储分配失败 */
    {
        return 0;
    }
    (*L)->next=NULL; /* 指针域为空 */

    return 1;
}

单链表测长的功能函数

/* 初始条件:单链表表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(LinkList L)
{
    int num=0;
    LinkList p=L->next; /* p指向第一个结点 */
    while(p)
    {
        num++;
        p=p->next;
    }
    return num;
}

完整的可执行程序如下:

#include<iostream>
using namespace std;

typedef struct node
{
    int data;
    struct node *next;
}Node, *LinkList;
/*         *********结构体定义的理解   ************     */
/*  这里的Node是结构体struct node的一个别名             */
/*  这里的*LinkList也是结构体struct node的一个别名      */
/*  换言之LinkList是结构体struct node类型的指针的别名   */
/*  也就是说struct node *p;这条语句等同于LinkList p;    */
/*  LinkList *L相当于struct node **L,是二级指针,如: 
    int i;
    int *pi = &i;  //这里定义了一个指向整型i的指针pi, &表示取地址符号
    int **ppi = &pi; //ppi就是一个二级指针,其指向指针pi的地址
*/

/*         *********初始化单链表   ************     */  
/*  初始化成功返回1,初始化失败返回0  */
int InitList(LinkList *L)   
{
*L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
/* 此处返回给L的是一个指针,并且赋给了头指针 */ 
    /*     *L其实就是头结点,L则为头指针        */
    if(!(*L)) /* 存储分配失败 */
    {
        return 0;
    }
    (*L)->next=NULL; /* 指针域为空 */

    return 1;
}

/* 初始条件:单链表表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(LinkList L)
{
    int num=0;
    LinkList p=L->next; /* p指向第一个结点 */
    while(p)
    {
        num++;
        p=p->next;
    }
    return num;
}

int main()
{
    LinkList L;
    int n; //存放链表结点个数
 
    n=InitList(&L);
    cout << "链表L初始化完毕,ListLength(L)= " << ListLength(L) <<endl;
    system("pause");
    return 0;
}

运行结果: