说明
链表
链表的基本思维是,利用结构体,在堆空间开辟出一个又一个节点,通过next指针指向下一个节点,这样独立的节点通过next指针相互链接,形成链表
data为自定义的数据类型,next为指向下一个链表结点的指针,通过访问next,可以引导我们去访问链表的下一个结点。
单链表
1、节点数据类型设计
typedef unsigned int data_type;
typedef struct Node
{
data_type data;
struct Node *next;
}linklist,*linkptr;
2、链表的初始化
书要是通过malloc函数在堆空间申请内存
linkptr link_create(void)
{
linkptr ptr;
ptr = (linkptr)malloc(sizeof(linklist));
if(NULL == ptr){
printf("malloc error");
return NULL;
}
ptr->next =NULL;
return ptr;
}
3、链表的插入
3.1头插法
每次都在list节点后面插入新的节点
int link_head_insert(linkptr list,int value)
{
linkptr ptr;
if ((ptr = (linkptr)malloc(sizeof(linklist))) == NULL)
{
printf("malloc error\n");
return ERROR;
}
ptr->data = value;
ptr->next = list->next;
list->next = ptr;
return OK;
}
3.2 尾插法
在最后一个节点插入新的节点
int link_end_insert(linkptr list,int value)
{
linkptr ptr;
if ((ptr = (linkptr)malloc(sizeof(linklist))) == NULL)
{
printf("malloc error\n");
return ERROR;
}
while (list->next)
{
list = list->next;
}
ptr->data = value;
list->next = ptr;
ptr->next = NULL;
return OK;
}
4、链表的遍历
void link_show(linkptr list)
{
while (list->next)
{
printf("%d\n",list->next->data);
list = list->next;
}
}
5、链表的查找
5.1、按照序号进行查找
void link_get_serial_number(linkptr list,int i)
{
int j = -1;
if(i<0) return ;
while ((list->next)&&j<i)
{
j++;
list = list->next;
}
if (j == i)
{
printf("data = %d\n",list->data);
}
else
{
return ;
}
}
5.2、按照数值进行查找
void link_get_value(linkptr list,int value)
{
list = list->next;
while (list->next && list->data != value)
{
list = list->next;
}
if (list->data == value)
{
printf("value = %d,在链表中存在\n",value);
}
else
{
printf("value = %d,在链表中不存在\n",value);
}
}
6、源码
#include "stdio.h"
#include "stdlib.h"
typedef unsigned int data_type;
#define ERROR -1
#define OK 0
typedef struct Node
{
data_type data;
struct Node *next;
}linklist,*linkptr;
linkptr link_create(void)
{
linkptr ptr;
ptr = (linkptr)malloc(sizeof(linklist));
if(NULL == ptr){
printf("malloc error");
return NULL;
}
ptr->next =NULL;
return ptr;
}
int link_head_insert(linkptr list,int value)
{
linkptr ptr;
if ((ptr = (linkptr)malloc(sizeof(linklist))) == NULL)
{
printf("malloc error\n");
return ERROR;
}
ptr->data = value;
ptr->next = list->next;
list->next = ptr;
return OK;
}
void link_show(linkptr list)
{
while (list->next)
{
printf("%d\n",list->next->data);
list = list->next;
}
}
int link_end_insert(linkptr list,int value)
{
linkptr ptr;
if ((ptr = (linkptr)malloc(sizeof(linklist))) == NULL)
{
printf("malloc error\n");
return ERROR;
}
while (list->next)
{
list = list->next;
}
ptr->data = value;
list->next = ptr;
ptr->next = NULL;
return OK;
}
void link_get_serial_number(linkptr list,int i)
{
int j = -1;
if(i<0) return ;
while ((list->next)&&j<i)
{
j++;
list = list->next;
}
if (j == i)
{
printf("data = %d\n",list->data);
}
else
{
return ;
}
}
void link_get_value(linkptr list,int value)
{
list = list->next;
while (list->next && list->data != value)
{
list = list->next;
}
if (list->data == value)
{
printf("value = %d,在链表中存在\n",value);
}
else
{
printf("value = %d,在链表中不存在\n",value);
}
}
int main(void)
{
#if 0
linkptr link;
link = link_create();
link_head_insert(link,10);
link_head_insert(link,20);
link_head_insert(link,30);
link_show(link);
#endif
#if 1
linkptr link;
link = link_create();
link_end_insert(link,10);
link_end_insert(link,20);
link_end_insert(link,30);
link_show(link);
#endif
link_get_serial_number(link,2);
link_get_value(link,20);
free(link);
return 0;
}
|