链表功能函数总结

链表功能函数总结

最近在学习数据结构的内容,链表(LinkList)就是数据结构中最基本的一种数据类型,链表本身的构造特性也特别有意思,这里就构造了一个链表的功能函数,包含了链表的创建初始化、打印输出、计算长度、查找中间结点和清除链表等功能,在今后的学习中会不断扩充添加不同的功能!
函数运行如下图所示:

LinkList

功能函数

链表创建函数

//声明链表创建函数(尾插法)
void ListCreat(LinkList *L, int n)
{
    LinkList *p, *r;
    int i;
    srand(time(0));
    p = L;
    for(i = 0; i < n; i++)
    {
        r = (LinkList *)malloc(sizeof(LinkList));
        p->data = rand() % 100 + 1;
        p->next = r;
        p = r;
    }
    p->next = NULL;
}

这里使用了尾插法对链表进行生成操作,使用rand()函数生成随机数对链表进行初始化。

链表打印函数

//打印链表函数
ListPrint(LinkList *L)
{
    LinkList *p;
    p = L;
    while(p->next != NULL)
    {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
}

通过判定p->next是否为NULL为条件对链表进行遍历打印。

获取链表长度

//声明一个函数,获取链表长度
int ListLength(LinkList *L)
{
    LinkList *p;
    p = L;
    int count = 0;
    while(p->next != NULL)
    {
        p = p->next;
        count++;
    }
    return count;
}

同上,通过判定p->next是否为NULL为条件对链表进行遍历计算链表的长度。

获取中间结点

//声明一个函数,获取链表中间结点
int ListMid(LinkList *L)
{
    LinkList *cur, *mid;
    cur = mid = L;
    while(cur->next != NULL)
    {
        if(cur->next->next != NULL)
        {
            mid = mid->next;
            cur = cur->next->next;
        }
        else
        {
            cur = cur->next;
        }
    }
    return mid->data;
}

设置cur的步长为2,mid的步长为1,同时对链表进行遍历,以cur == NULL为结束条件,可以以较高的效率得到链表的中间结点。

链表清除

//声明链表清理函数
void ListClear(LinkList *L)
{
    LinkList *p;
    p = L;
    while(L->next != NULL)
    {
        L = p->next;
        free(p);
        p = L;
    }
    free(L);
}

使用free()函数对我们生成的链表空间进行遍历删除。


总体代码

#include <stdio.h>
#include <stdlib.h>
//声明链表结构体
typedef struct node
{
    int data;
    struct node *next;
}LinkList;
//声明链表创建函数(尾插法)
void ListCreat(LinkList *L, int n)
{
    LinkList *p, *r;
    int i;
    srand(time(0));
    p = L;
    for(i = 0; i < n; i++)
    {
        r = (LinkList *)malloc(sizeof(LinkList));
        p->data = rand() % 100 + 1;
        p->next = r;
        p = r;
    }
    p->next = NULL;
}
//打印链表函数
ListPrint(LinkList *L)
{
    LinkList *p;
    p = L;
    while(p->next != NULL)
    {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
}
//声明一个函数,获取链表长度
int ListLength(LinkList *L)
{
    LinkList *p;
    p = L;
    int count = 0;
    while(p->next != NULL)
    {
        p = p->next;
        count++;
    }
    return count;
}
//声明一个函数,获取链表中间结点
int ListMid(LinkList *L)
{
    LinkList *cur, *mid;
    cur = mid = L;
    while(cur->next != NULL)
    {
        if(cur->next->next != NULL)
        {
            mid = mid->next;
            cur = cur->next->next;
        }
        else
        {
            cur = cur->next;
        }
    }
    return mid->data;
}
//声明链表清理函数
void ListClear(LinkList *L)
{
    LinkList *p;
    p = L;
    while(L->next != NULL)
    {
        L = p->next;
        free(p);
        p = L;
    }
    free(L);
}
//主函数
int main()
{
    printf("1.生成链表\n");
    printf("2.打印链表\n");
    printf("3.获取链表长度\n");
    printf("4.获取中间结点\n");
    printf("5.清楚链表\n");
    printf("0.退出\n");
    LinkList *L;
    L = (LinkList *)malloc(sizeof(LinkList));
    int length = 10;
    char operator;
    while(1)
    {
        scanf("%c", &operator);
        switch(operator)
        {
            case '1':
                printf("**********生成链表***********\n");
                ListCreat(L, length);
                break;
            case '2':
                printf("**********打印链表**********\n");
                ListPrint(L);
                break;
            case '3':
                printf("********获取链表长度********\n");
                printf("The length of this ListCreat is: %d\n", ListLength(L));
                break;
            case '4':
                printf("********获取中间结点********\n");
                printf("The value of the middle node is: %d\n", ListMid(L));
                break;
            case '5':
                ListClear(L);
                printf("**********清楚完毕**********\n");
                break;
            case '0':
                printf("************退出************\n");
                return 0;
        }
    }
    return 0;
}

github Githubhttps://github.com/haoyuanliu
个人博客 个人博客http://haoyuanliu.github.io/

个人站点,欢迎访问,欢迎评论!

posted @ 2016-05-11 20:42  贫贫贫贫僧  阅读(530)  评论(0编辑  收藏  举报