数据结构--单链

#include "link.h"

plink get_head()

{

plink p=malloc(sizeof(Link));

if(p==NULL)

{

printf("申情节点失败\n");

return NULL;

}

p->len=0;

p->next=NULL;

return p;

}

void head_insert(plink L,int a)

{

if(L==NULL)

{

printf("单链表不存在\n");

}

plink p=malloc(sizeof(Link));//申请新节点

p->data=a;//新节点赋值

p->next=L->next;//将第一个节点的地址放入新节点指针域

L->next=p;//将新节点地址放入头结点指针域

L->len++;

}

void node_output(plink L)

{

if(L==NULL||L->len==0)

{

printf("单链表不存在或者为空\n");

}

plink t=L;

for(int i=0;i<L->len;i++)

{

t=t->next;

printf("%d\t",t->data);

}

putchar(10);

}

void tail_insert(plink L,int a)

{

if(L==NULL)

{

printf("单链表不存在\n");

}

plink t=L;

for(int i=0;i<L->len;i++)

{

t=t->next;

}

plink p=malloc(sizeof(Link));//申请新节点

p->data=a;//新节点赋值

t->next=p;

p->next=NULL;

L->len++;

}

void any_insert(plink L)

{

if(NULL==L)

{

printf("插入失败\n");

}

int key,x;

printf("请输入要插入的位置:");

scanf("%d",&key);

plink t=L;

for(int i=0;i<key-1;i++)

{

t=t->next;

}

printf("请输入要插入的值:");

scanf("%d",&x);

plink p=malloc(sizeof(Link));//申请新节点

p->data=x;//新节点赋值

p->next=t->next;

t->next=p;

L->len++;

}

void head_dele(plink L)

{

if(NULL==L)

{

printf("单链表不存在或者为空\n");

}

plink t=L->next;

L->next=t->next;

L->len--;

free(t);

t=NULL;

}

void tail_dele(plink L)

{

if(NULL==L||L->len==0)

{

printf("单链表不存在或者为空\n");

}

plink t=L;

for(int i=0;i<L->len-1;i++)

{

t=t->next;

}

plink q=t->next;

t->next=NULL;

L->len--;

free(q);

q=NULL;

}

void any_dele(plink L)

{

if(L==NULL||L->len==0)

{

printf("单链表不存在或者为空\n");

}

int key;

printf("请输入要删除的位置:");

scanf("%d",&key);

plink t=L;

for(int i=0;i<key-1;i++)

{

t=t->next;

}

plink p=t->next;//申请新节点

t->next=t->next->next;

L->len--;

free(p);

p=NULL;

}

void find_change(plink L)

{

int key,sub=-1,x;

printf("请输入要查找的数:");

scanf("%d",&key);

printf("请输入要修改的值:");

scanf("%d",&x);

if(L==NULL||L->len==0)

{

printf("单链表不存在或为空\n");

}

plink t=L;

for(int i=0;i<L->len;i++)

{

t=t->next;

if(t->data==key)

{

sub=i;

t->data=x;

}

}

if(sub==-1)

{

printf("不存在该节点\n");

}

}

void node_reverse(plink L)

{

if(L==NULL||L->len==0)

{

printf("单链表不存在或为空\n");

}

plink q=L->next->next;

plink t=L->next;

while(q!=NULL)

{

t->next=q->next;

q->next=L->next;

L->next=q;

q=t->next;

}

}

void node_sort(plink L)//升序

{

if(L==NULL||L->len==0)

{

printf("单链表不存在或为空\n");

}

for(int i=0;i<L->len-1;i++)

{

plink q=L->next->next;

plink t=L->next;

while(q!=NULL)

{

if(q->data<t->data)

{

t->next=q->next;

q->next=L->next;

L->next=q;

q=t->next;

}

else

{

t=t->next;

q=q->next;

}

}

}

}

void node_cut(plink L)

{

if(L==NULL||L->len==0)

{

printf("单链表不存在或为空\n");

}

plink t=L->next;

plink q=L->next->next;

while(q!=NULL)

{

L->next=q;

free(t);

t=q;

q=t->next;

L->len--;

}

free(t);

t=NULL;

L->len--;

}

#ifndef _LINK_H

#define _LINK_H

#include<myhead.h>

typedef struct node//节点结构体

{

union

{

int len;//链表长度

int data;//节点数据域,存储数据

};//节省空间

struct node *next;//指向下一个指针节点

}Link,*plink;//结构体普通类型

plink get_head();

void head_insert(plink,int);

void node_output(plink);

void tail_insert(plink,int);

void any_insert(plink);

void head_dele(plink);

void tail_dele(plink);

void any_dele(plink);

void find_change(plink);

void node_reverse(plink);

void node_sort(plink);

void node_cut(plink);

#endif

#include "link.h"

int main(int argc, const char *argv[])

{

//申请头结点函数,返回头结点地址给L

plink L=get_head();

//头插法 创建整个表

int a[10]={10,20,30,40,50,60,70,80,90,95};

for(int i=0;i<10;i++)

{

head_insert(L,a[i]);

}

//尾插法创建整个表

for(int i=0;i<10;i++)

{

tail_insert(L,a[i]);

}

//单链表遍历

node_output(L);

putchar(10);

any_insert(L);

node_output(L);

putchar(10);

head_dele(L);

node_output(L);

putchar(10);

tail_dele(L);

node_output(L);

any_dele(L);

node_output(L);

putchar(10);

find_change(L);

node_output(L);

putchar(10);

node_reverse(L);

node_output(L);

putchar(10);

node_sort(L);

node_output(L);

putchar(10);

node_cut(L);

node_output(L);

return 0;

}

相关推荐
XuanRanDev3 小时前
【数据结构】树的基本:结点、度、高度与计算
数据结构
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
Coovally AI模型快速验证4 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
王磊鑫4 小时前
C语言小项目——通讯录
c语言·开发语言
可为测控4 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨5 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
BoBoo文睡不醒5 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end6 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法