数据结构之单链表操作

数据结构,单链表操作,本来应该三年前就应该会的,奈何上学的时候呼呼睡大觉,最近看代码又接触到了,花了几天时间自己重新写了一下
链表操作应该是基础的,并且需要会的,虽然只是简单地初始化,增加链表节点等简单操作,但是考查了很重要的知识点,指针,结构体,形参实参,还有简单的算法

#include 
#include 
#include 

typedef struct List{
        struct List *next;
        int data;
}mylist;

void init_mylist(mylist **list);//初始化链表
void add_mylist(mylist *list);//增加节点
void arry_mylist(mylist *list);//非递减排序
void merge_mylist(mylist *list1,mylist *list2,mylist *list3);//链表合并
void printf_mylist(mylist *list);//打印链表
//主函数
int main(int argc, char *argv[])
{
        mylist *l1,*l2,*l3;
        srand(time(NULL));
        init_mylist(&l1);
        init_mylist(&l2);
        init_mylist(&l3);
        //printf("%d\n",l1->data);
        for(int i=0;i<5;i++)
        {
                add_mylist(l1);
                add_mylist(l2);
        }
        printf_mylist(l1);
        printf_mylist(l2);
        arry_mylist(l1);
        arry_mylist(l2);
        printf_mylist(l1);
        printf_mylist(l2);
        merge_mylist(l1,l2,l3);
        printf_mylist(l3);
        return 0;
}

void init_mylist(mylist **list)
{
        mylist *l;
        l = malloc(sizeof(mylist));//头结点
        l->data = 1;//头结点数据区,保存数据节点数
        l->next = NULL;
        *list = l;
}

void add_mylist(mylist *list)
{
        mylist *l = list;
        mylist *li;
        li = malloc(sizeof(mylist));
        li->data = rand()%30;//随机数
        li->next = NULL;
        while(l->next)
        {
                l = l->next;
        }
        l->next = li;
        list->data = list->data +1;//节点数加一
}

void printf_mylist(mylist *list)
{
        mylist *l = list;
        while(l)
        {
                printf("%d\t",l->data);//打印在一行,水平制表符间隔
                l = l->next;
        }
        printf("\n");//换行
}

void arry_mylist(mylist *list)
{
        mylist *l = list->next;
        mylist *l1;
        int a;
        while(l->next)
        {
                l1 = l->next;
                while(l1)
                {
                        if(l->data >= l1->data)//这个我只是用简单地用元素交换方法
                        {
                                a = l->data;
                                l->data = l1->data;
                                l1->data = a;
                        }
                        l1 = l1->next;
                }
                l = l->next;
        }
}

void merge_mylist(mylist *list1,mylist *list2,mylist *list3)
{
        mylist *l1 = list1->next;
        mylist *l2 = list2->next;
        mylist *l3 = list3;
        while(l1 && l2)
        {
                if(l1->data < l2->data)
                {
                        l3->next = l1;
                        l1 = l1->next;
                }else{
                        l3->next = l2;
                        l2 = l2->next;
                }
                l3 = l3->next;
        }
        if(l1)
        {
                l3->next = l1;
        }else{
                l3->next = l2;
        }
        list3->data = list1->data + list2->data - 1;//计算总节点数
}

编译和运行结果
数据结构之单链表操作_第1张图片
我这也算是在补课吧

你可能感兴趣的:(c语言基础,链表,数据结构)