C语言高级进阶

链表是由一系列互相连接的节点组成的数据结构,这种数据结构非常有用,是实现队列和栈的基础。

学习内容

这一章我们继续单链表的学习,实现一个单链表的创建,插入,删除,判空,显示以及销毁。代码来自于(B站)史上最强最细腻的linux嵌入式C语言学习教程【李慧芹老师】,需要学习的童鞋自行搜索观看,此处不多介绍。

学习产出

list.h

#ifndef __LIST_H__
#define __LIST_H__

typedef int datatype;

typedef struct node_st
{
	datatype data;
	struct node_st *next;
}list;

list *list_create();

int list_insert_at(list *, int i, datatype *);

int list_order_insert(list *, datatype *);

int list_delete_at(list *, int i, datatype *);

int list_delete(list *, datatype *);

int list_isempty(list *);

void list_display(list *);

void list_destroy(list *);

#endif

list.c

#include <stdio.h>
#include <stdlib.h>
#include "list.h"

list *list_create()
{
	list * me;

	me = malloc(sizeof(*me));

	if(NULL == me)
		return NULL;

    me->next = NULL;

	return me;
}

int list_insert_at(list *me, int i, datatype *data)
{
    int j = 0;
    list *node = me, *newnode;

    if(i<0)
    {
    	return -1;
    }

    while(j<i && NULL != node)
    {
         node = node->next;
         j++;
    }

    if(node)
    {
         newnode = malloc(sizeof(*newnode));
         if(NULL == newnode)
         	return -2;

         newnode->data = *data;
         newnode->next = NULL;

         newnode->next = node->next;
         node->next = newnode;

         return 0;
    }
    else
    	return -3;
}

int list_order_insert(list *me, datatype *data)
{
    list *p = me, *q;
    while(p->next && p->next->data < *data)
    {
        p = p->next;
    }

    q = malloc(sizeof(*q));
    if(NULL == q)
        return -1;

    q->data = *data;
    q->next = p->next;
    p->next = q;

    return 0;

}

int list_delete_at(list *me, int i, datatype *data)
{
    int j = 0;
    list *p =me, *q;

    *data = 0;

    if(i<0)
        return -1;

    while(j < i && p)
    {
        p = p->next;
        j++;
    }

    if(p)
    {
        q = p->next;
        p->next = q->next;
        *data = q->data;
        free(q);
        q = NULL;
        return 0;
    }
    else
    return -2;

    return 0;

}

int list_delete(list *me, datatype *data)
{
    list *p = me, *q;

    while(p->next && p->next->data != *data)
        p = p->next;

    if((NULL == p->next))
        return -1;
    else
    {
        q =p->next;
        p->next = q->next;
        free(q);
        q = NULL;
    }

    return 0;
}

int list_isempty(list *me)
{
	if(NULL == me->next)
		return 0;

	return 1;
}

void list_display(list *me)
{
    list *node = me->next;
    if(0 == list_isempty(me))
    	return;

    while(NULL != node)
    {
    	printf("%d \t", node->data);
    	node = node->next;
    }

    printf("\n");

    return ;
}

void list_destroy(list *me)
{
	list * node, *next;

	for(node = me->next; NULL != node; node = next)
	{
		next = node->next;
		free(node);
	}

	free(me);
	return ;
}

main.c中进行测试:

#include <stdio.h>
#include <stdlib.h>

#include "list.h"

int main()
{
	list *l;
	int i;

	datatype arr[] = {11, 9, 22, 33, 56, 44};

	l = list_create();

	if(NULL == l)
	{
		exit(1);
	}

//顺序插入
	for(i = 0; i < sizeof(arr)/sizeof(*arr); i++)
	{
		if(list_order_insert(l, &arr[i]))
			exit(1);
	}

    list_display(l);
    printf("********************************************************************\n");

//按值删除节点
    int value1 = 22;

    list_delete(l, &value1);

    list_display(l);
    printf("********************************************************************\n");

//按位置删除节点
    int j = 3, err;
    datatype value2;

     err = list_delete_at(l, j, &value2);
    if(err)
        exit(1);

    list_display(l);
    printf("********************************************************************\n");

    printf("delete value:%d\n", value2);

    list_destroy(l);

}

更多推荐