单链表创建以及头插、尾插(一)-(B站)史上最强最细腻的linux嵌入式C语言学习教程【李慧芹老师】
·
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);
}
更多推荐


所有评论(0)