C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)
一,数据结构——链表全操作:
链表形式:
其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点;
特别说明:对于单链表,每个节点(Node)可以通过指针域(Node *next)来找到下一个节点,但却不能够找到上一个节点;
只需要知道头结点就可以确定整个链表;
对链表进行的操作一般都需要遍历链表,而链表结束的标志为NULL(要么next指针为空,要么头结点为空);
若要断开两个节点联系,要先保存下个节点,否则后面的节点无法找到;
关于链表逆序,思想为将指针方向对调,最后头节点为原链表最后一个节点;
以下为链表增,删,改,查,逆序,排序的函数实现:
link.h
#ifndef LINK_H_INCLUDED
#define LINK_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#define datatype int struct node
{
int num;
int data;
struct node* next;
}; typedef struct node Node; void backaddnode(Node **ppnode, int num, datatype data);//增加节点
Node *backaddnodeA(Node *pnode, int num, datatype data);//
void showallnode(Node *pnode);//显示所有的节点
Node *searchfirst(Node *pnode, int num);//查询
int change(Node *pnode, int oldnum, int newnum);//修改失败返回0,成功返回1
Node *rev(Node *pnode);//链表的逆转
Node *del(Node *pnode, int num);//删除
Node *insert(Node *pnode, int findnum, int newnum, datatype data);//实现插入,前面插入
void sort(Node *pnode, char ch);//ch==> ch==< #endif // LINK_H_INCLUDED
link.cpp
#include "link.h" void backaddnode(Node **ppnode, int num, datatype data)
{
Node *newnode = (Node*)malloc(sizeof(Node));
newnode->num = num;
newnode->data = data;
newnode->next = NULL; if (*ppnode == NULL)
{
*ppnode = newnode;
}
else
{
Node *p = *ppnode;
while (p->next != NULL)
{
p = p->next;
}
p->next = newnode;
}
} Node *backaddnodeA(Node *pnode, int num, datatype data)
{
Node *newnode = (Node*)malloc(sizeof(Node));
newnode->num = num;
newnode->data = data;
newnode->next = NULL; if (pnode == NULL)
{
pnode = newnode;
} else
{
Node *p = pnode;
while (p->next != NULL)
{
p = p->next;
}
p->next = newnode;
}
return pnode;
} void showallnode(Node *pnode)
{
printf("链表:\n");
while (pnode != NULL)
{
printf("%d->", pnode->data);
pnode = pnode->next;
}
printf("NULL\n");
} Node *searchfirst(Node *pnode, int num)
{
while (num != pnode->num&&pnode != NULL)
{
pnode = pnode->next;
}
return pnode;
} int change(Node *pnode, int oldnum, int newnum)
{
while (oldnum != pnode->num&&pnode != NULL)
{
pnode = pnode->next;
}
if (pnode != NULL)
{
pnode->num = newnum;
return ;
}
else
{
return ;
}
} Node *del(Node *pnode, int num)
{
Node *p = pnode;
Node *ppre = pnode; while (p->num != num&&p != NULL)
{
ppre = p;
p = p->next;
}
if (p != pnode)
{
ppre->next = p->next;
free(p);
p = NULL; }
else
{
pnode = pnode->next;
free(p);
}
return pnode;
} Node * insert(Node *pnode, int findnum, int newnum, datatype data)
{
Node *newnode = (Node*)malloc(sizeof(Node));
newnode->num = newnum;
newnode->data = data;
newnode->next = NULL;
Node *p = pnode;
Node *ppre = pnode;
while (p->num != findnum&&p != NULL)
{
ppre = p;
p = p->next;
} if (p == pnode)
{
newnode->next = pnode;
pnode = newnode;
}
else if (p != NULL)
{
ppre->next = newnode;
newnode->next = p;
}
return pnode;
} void sort(Node *pnode, char ch)
{
if (ch == '>')
{
Node temp;
for (Node *p1 = pnode; p1!=NULL; p1=p1->next)
{
for (Node *p2 = p1; p2 != NULL; p2 = p2->next)
{
if (p1->data<p2->data)
{
temp.num = p1->num;
p1->num = p2->num;
p2->num = temp.num; temp.data = p1->data;
p1->data = p2->data;
p2->data = temp.data;
}
}
}
}
else
{
Node temp;
for (Node *p1 = pnode; p1 != NULL; p1 = p1->next)
{
for (Node *p2 = p1; p2 != NULL; p2 = p2->next)
{
if (p1->data>p2->data)
{
temp.num = p1->num;
p1->num = p2->num;
p2->num = temp.num; temp.data = p1->data;
p1->data = p2->data;
p2->data = temp.data;
}
}
}
}
} Node *rev(Node *pnode)
{
Node *p1, *p2, *p3;
if (pnode == NULL || pnode->next==NULL)
{
return pnode;
}
else
{
p1 = pnode;
p2 = pnode->next;
while (p2 != NULL)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
pnode->next = NULL;
pnode = p1;
return pnode;
}
}
二,链式队列(入列,出列,清空,打印,优先队列,递归实现)
队列特点:先进先出(FIFO)
入列:在链表尾部插入节点;
出列:指针p记录链表头节点head,然后将头结点head赋值为head->next,释放p并赋值为NULL,新队列头节点为head;
清空与打印:使用递归,打印时先输出节点信息,再进入下一层递归;清空队列时先进入下一层递归后释放节点空间;
优先队列:在插入元素时,按优先级使用插入排序即可得到按优先级排列的队列;
queue_link.h
struct queue
{
int num;//代表数据
int high;//优先级1111
struct queue *pNext;//存储下一个节点的地址
}; typedef struct queue Queue;//简化队列 Queue * initque(Queue *queueA);//初始化
Queue * EnQueue(Queue *queueA, int num, int high);//入队
Queue * DeQueue(Queue *queueA, Queue *pout);//出队
Queue * freeall(Queue *queueA);//清空
void sort(Queue *queueA);//优先级排队
void printfall(Queue *queueA);//打印所有数据,递归
Queue * insertEnQueue(Queue *queueA, int num, int high);
queue_link.c
#include "Queue_link.h"
#include <stdio.h>
#include <stdlib.h> Queue *initque(Queue *queueA)//初始化
{
queueA = NULL;
return queueA;
} Queue *EnQueue(Queue *queueA, int num, int high)//入队
{
Queue *newnode = (Queue *)malloc(sizeof(Queue));
newnode->num = num;
newnode->high = high;
newnode->pNext = NULL; if (queueA == NULL)
{
queueA = newnode;
}
else
{
Queue *p = queueA;
while (p->pNext!=NULL)
{
p = p->pNext;
}
p->pNext = newnode;
}
return queueA;
} Queue *DeQueue(Queue *queueA, Queue *pout)//出队
{
if (queueA == NULL)
{
pout = NULL;
return NULL;
}
else
{
pout->num = queueA->num;
pout->high = queueA->high;
pout->pNext = NULL; Queue *p = queueA;
queueA = queueA->pNext;
free(p);
}
return queueA;
} Queue *freeall(Queue *queueA)//清空
{
if (queueA == NULL)
{
return queueA;
}
else
{
freeall(queueA->pNext);
free(queueA);
queueA = NULL;
}
} //void sort(Queue *queueA);//优先级排队 void printfall(Queue *queueA)//打印所有数据,递归
{
if (queueA==NULL)
{
return;
}
else
{
printf("num=%d,high=%d,addr=%p\n",queueA->num,queueA->high,queueA);
printfall(queueA->pNext);
}
} Queue * insertEnQueue(Queue *queueA, int num, int high)//按优先级插入队列
{
Queue *newnode = (Queue *)malloc(sizeof(Queue));
newnode->num = num;
newnode->high = high;
newnode->pNext = NULL; if (queueA == NULL)
{
queueA = newnode;
}
else if (queueA->high>newnode->high)
{
newnode->pNext = queueA;
queueA = newnode;
}
else
{
Queue *p1;
for (p1 = queueA; p1->pNext!=NULL; p1=p1->pNext)
{
if (newnode->high < p1->pNext->high)
{
break;
}
} newnode->pNext = p1->pNext;
p1->pNext = newnode;
}
return queueA;
}
三,链式栈(入栈,出栈,显示,清空)
栈特点:先进后出(FILO)
入栈:在链表最后增加新节点;
出栈:将链表第一个元素输出,并将其从链表删除;
stack_link.h
#define datatype int
struct stacknode
{
int num;//编号
datatype data;//数据
struct stacknode *pNext;//指针域 };
typedef struct stacknode StackNode;//简化
StackNode * init(StackNode * phead);//初始化
StackNode * push(StackNode * phead, int num, datatype data);//进栈
StackNode * pop(StackNode * phead, StackNode * poutdata);//出栈
StackNode * freeall(StackNode * phead);//清空
void printfall(StackNode * phead);//打印
stack_link.c
#include "static_link.h"
#include <stdio.h>
#include <stdlib.h> StackNode * init(StackNode * phead)//初始化
{
phead = NULL;
return phead;
} StackNode * push(StackNode * phead, int num, datatype data)//进栈
{
StackNode *newnode = (StackNode*)malloc(sizeof(StackNode));
newnode->num = num;
newnode->data = data;
newnode->pNext = NULL;
if (phead == NULL)
{
phead = newnode;
}
else
{
StackNode *p = phead;
while (p->pNext!=NULL)
{
p = p->pNext;
}
p->pNext = newnode;
}
return phead; } StackNode * pop(StackNode * phead, StackNode * poutdata)//出栈
{
if (phead == NULL)
{
poutdata = NULL;
}
else if (phead->pNext == NULL)
{
poutdata->num = phead->num;
poutdata->data = phead->data;
poutdata->pNext = NULL;
free(phead);
phead = NULL;
}
else
{
StackNode *p = phead;
while (p->pNext->pNext!=NULL)
{
p = p->pNext;
}
poutdata->num = p->pNext->num;
poutdata->data = p->pNext->data;
poutdata->pNext = NULL; free(p->pNext);
p->pNext = NULL;
}
return phead;
} StackNode * freeall(StackNode * phead)//清空
{
if (phead == NULL)
{
return NULL;
} else
{
/*StackNode *p1 = phead, *p2 = phead;
while (p1->pNext!=NULL)
{
p2 = p1->pNext;
p1->pNext = p2->pNext;
free(p2);
p2 = NULL;
}
free(phead);
phead = NULL;*/
freeall(phead->pNext);
free(phead);
phead = NULL;
}
} void printfall(StackNode * phead)//打印
{
if (phead == NULL)
{
return ;
}
else
{
printf("num=%d,data=%d,addr=%p\n",phead->num,phead->data,phead);
printfall(phead->pNext);
}
}
C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)的更多相关文章
- django单表操作 增 删 改 查
一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- django ajax增 删 改 查
具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- MVC EF 增 删 改 查
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
- python基础中的四大天王-增-删-改-查
列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...
- MongoDB增 删 改 查
增 增加单篇文档 > db.stu.insert({sn:'001', name:'lisi'}) WriteResult({ "nInserted" : 1 }) > ...
随机推荐
- HW3.14
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- HDU-4419 Colourful Rectangle 矩形多面积并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 利用二进制,R为1.G为2.B为4,然后通过异或运算可以得到其它组合颜色.建立7颗线段树,每颗线 ...
- Golang项目目录结构组织
其实golang的工程管理还是挺简单的,完全使用目录结构还有package名来推导工程结构和构建顺序. 当然,首先要说的是环境变量$GOPATH,项目构建全靠它.这么说吧,想要构建一个项目,就要将这个 ...
- win32键盘记录 -- 自定义窗口类
最近学了些关于window api编程的知识,于是琢磨编写一些键盘记录器,能够把输入的按键输出到窗口内,并且实现窗口自动滚动. 封装窗口类使用了GWL_USERDATA字段来保存this指针,比较容易 ...
- 读FCL源码系列之List<T>---让你知其所以然---内含疑问求大神指点
序言 在.NET开发中,List<T>是我们经常用到的类型.前段时间看到其他部门小伙伴讨论“两个List(10W个元素)集合求并集,list1.Where(p=>list2.Cont ...
- Spring Autowire自动装配
在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象.但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的< ...
- Sublime Text 3103 Crack 破解 注册码
随机复制下面的几四个注册码 粘贴到sublime text 3(Build 3103)注册框 就可以了! ----------------------------------------------- ...
- C++ CheckListBox
实现过程 CCheckListBox listbox1; listbox1.AddString("葡萄"); listbox1.AddString(" ...
- MySQL对于datetime 源码分析
http://tsecer.blog.163.com/blog/static/150181720160117355684/ 一.时间比较的语法分析 在mysql中,通常时间是一个必不可少的类型,而 ...
- 神奇的 BlocksKit(1):源码分析(下)
私有类 _BKObserver _BKObserver 是用来观测属性的对象,它在接口中定义了 4 个属性: @property (nonatomic,readonly,unsafe_unretain ...