单链表由一个个节点组成,节点包括数据域和指针域,数据域只保存数据值,指针域保存的是下一个节点的地址,如果要访问某一个节点,只要找到指向这个节点的指针域就行。实现代码如下:
seqlist.c
#include"seqlist.h"
//创建单链表,创建头结点
link *head_create()
{
link *H = (link *)malloc(sizeof(link));
if(H == NULL)
{
printf("内存申请失败!");
return NULL;
}else
{
//头结点初始化
H->len = 0;
H->next = NULL;
return H;
}
}
//创建结点函数
link *create_node()
{
link *P = (link *)malloc(sizeof(link));
if(P ==NULL)
{
printf("创建新结点失败!");
return NULL;
}else
{
return P;
}
}
// 头插
void head_insert(link *H,int data)
{
if(H == NULL)
{
printf("入参为空!");
return;
}
link * p = create_node();
p->data = data;
//断开旧的链接插入的结点
p->next = H->next;
H->next = p;
H->len++;
}
//判空
int empty_link(link *H)
{
if(H == NULL)
{
printf("入参为空!");
return -1;
}
return H->next == NULL?1:0;
}
//任意位置插入数据
void insert_post_link(link *H,int data,int post)
{
if(H == NULL)
{
printf("入参为空!");
return;
}
else if(post<=0 || post>H->len+1)
{
printf("位置不合理,请检查");
return;
}
int i;
link *p=H;
//找到要插位置的前一个结点
for(i=0;i<post-1;p=p->next,i++);
link *new = create_node();
//插入新结点
new->data = data;
new->next = p->next;
p->next = new;
H->len++;
}
//尾插
void insert_tail(link *H,int data)
{
if(H == NULL)
{
printf("入参为空!");
return;
}
link *p = H->next;
while(p->next!=NULL)
{
p = p->next;
}
link *new = create_node();
new->data = data;
new->next = p->next;
p->next = new;
H->len++;
}
//按值查找
void serch_value(link *H,int data)
{
if(H == NULL)
{
printf("入参为空!");
return;
}
link *p = H->next;
while(p->next != NULL)
{
if(p->data == data)
{
printf("p->data:%d\n",p->data);
}
p = p->next;
}
}
// 按位置查找
link *search_post(link *H,int post)
{
if(H == NULL)
{
printf("入参为空!");
return NULL;
}
if(post<=0 || post>H->len+1)
{
printf("位置不合理,请检查\n");
return NULL;
}
link *p = H;
int i;
for(i=0;i<post;i++,p = p->next);
return p;
}
//头删
void head_delete(link *H)
{
if(H == NULL)
{
printf("入参为空!");
return;
}
//判空
if(empty_link(H))
{
printf("链表为空,请检查!\n");
return;
}
//定义一个指针来保存要删除的结点,便于释放
link *p = H->next;
H->next =H->next->next;
free(p);
p = NULL;
H->len--;
}
//尾删
void dele_tail(link *H)
{
if(H == NULL)
{
printf("入参为空!");
return;
}
//判空
if(empty_link(H))
{
printf("链表为空,请检查!\n");
return;
}
link *p = H;
while(p->next->next !=NULL)
{
p = p->next;
}
free(p->next);
p->next = NULL;
H->len--;
}
//合并链表
void merge_link(link *H,link *H1)
{
if(H == NULL || H1 == NULL)
{
printf("链表为空,请检查!\n");
return;
}
link *p =H;
while(p->next != NULL)
{
p = p->next;
}
H->len += H1->len;
p->next = H1->next;
free(H1);
H1 = NULL;
}
//按位修改
void updata_post(link *H,int post,int data)
{
link * p=search_post(H,post);
if(p == NULL)
{
printf("err\n");
return;
}else
{
p->data = data;
}
}
//链表倒置
void inversion_link(link *H)
{
if(H == NULL)
{
printf("入参为空!");
return;
}
link *p=H->next;
H->next = NULL;
link *k = NULL;
while(p!=NULL)
{
k=p;
p=p->next;
k->next = H->next;
H->next = k;
}
}
//打印单链表
void printf_link(link *H)
{
if(H == NULL)
{
printf("入参为空!");
return;
}
link *p =H->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p = p->next;
}
}
seqlist.h
#ifndef __SEQ_LIST__
#define __SEQ_LIST__
#include <stdlib.h>
#include <stdio.h>
typedef struct listlink
{
union
{
int len;
int data;
};
struct listlink *next;//指针指向下一个结点
}link;
//创建单链表,创建头结点
link *head_create();
//创建结点函数
link *create_node();
// 头插
void head_insert(link *H,int data);
//判空
int empty_link(link *H);
//任意位置插入数据
void insert_post_link(link *H,int data,int post);
//尾插
void insert_tail(link *H,int data);
//按值查找
void serch_value(link *H,int data);
// 按位置查找
link *search_post(link *H,int post);
//头删
void head_delete(link *H);
//尾删
void dele_tail(link *H);
//按位修改
void updata_post(link *H,int post,int data);
//合并链表
void merge_link(link *H,link *H1);
//链表倒置
void inversion_link(link *H);
//打印单链表
void printf_link(link *H);
#endif
main.c
#include<stdio.h>
#include"seqlist.h"
int main(int argc, char const *argv[])
{
link *H =head_create();
head_insert(H,10);
head_insert(H,20);
head_insert(H,30);
insert_post_link(H,100,2);
insert_tail(H,40);
//serch_value(H,20);
head_delete(H);
dele_tail(H);
link *H1 =head_create();
head_insert(H1,60);
head_insert(H1,70);
head_insert(H1,80);
merge_link(H,H1);
updata_post(H,3,520);
inversion_link(H);
printf_link(H);
printf("end\n");
// link * p = search_post(H,3);
// if(p == NULL)
// {
// printf("按位查找失败!\n");
// }else
// {
// printf("p->data:%d\n",p->data);
// }
return 0;
}