一,数据结构——链表全操作:

链表形式:

其中,每个节点(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语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)的更多相关文章

  1. django单表操作 增 删 改 查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  2. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  3. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  4. django ajax增 删 改 查

    具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...

  5. iOS FMDB的使用(增,删,改,查,sqlite存取图片)

    iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...

  6. ADO.NET 增 删 改 查

    ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...

  7. MVC EF 增 删 改 查

    using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...

  8. python基础中的四大天王-增-删-改-查

    列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...

  9. MongoDB增 删 改 查

    增 增加单篇文档 > db.stu.insert({sn:'001', name:'lisi'}) WriteResult({ "nInserted" : 1 }) > ...

随机推荐

  1. Android 单字阅读

    package com.desmand.screencapture; import android.app.Activity; import android.content.Intent; impor ...

  2. 每个android项目都应该使用的android 库

    http://blog.teamtreehouse.com/android-libraries-use-every-project A good developer knows to never re ...

  3. 中局域网LAN中建立局域网可访问的类GitHub的服务器

    There are several ways to do this Host internal repositories like Gitlab (free software) or Stash. T ...

  4. ListView多选操作模式详解CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL

    这篇文章我们将详细的介绍如何实现ListView的多选操作,文中将会纠正在使用ListViewCHOICE_MODE_MULTIPLE或者CHOICE_MODE_MULTIPLE_MODAL时容易犯的 ...

  5. HDU 4849-Wow! Such City!(最短路)

    Wow! Such City! Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Other ...

  6. jitsi

    http://code.csdn.net/openkb/p-Jitsi https://download.jitsi.org/jitsi/nightly/ https://download.jitsi ...

  7. 阿里云ONS而微软Azure Service Bus体系结构和功能比较

    阿里云ONS而微软Azure Service bus体系结构和功能比较 版权所有所有,转载请注明出处http://blog.csdn.net/yangzhenping.谢谢! 阿里云的开放消息服务: ...

  8. MP3的频率、比特率、码率与音质的关系

    想知道MP3的频率.比特率.码率与音质的关系,是不是频率越高,码率越高,音质就越好.好像MP3大多数的频率都是44100HZ的.码率有128,192等等. 这里所说的频率是採样率,一般都是44100K ...

  9. 谈谈JSON数据格式

    JSON 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.        本文主要是对JS操作JSON的要领做下总结.           在JSON中,有两种结构:对 ...

  10. java与.net比较学习系列开发环境和常用调试技巧常用操作快捷键

    调试         F5 F11 调试运行   CTRL+F5 暂无 非调试运行   F6 不适用 编译整个解决方案   SHIFT+F6 不适用 编译当前选择的工程   SHIFT+F5 CTRL ...