链表的几种操作
来源:互联网 发布:淘宝创业好项目 编辑:程序博客网 时间:2024/06/05 00:11
//链表的几种操作,包括,创建链表,插入节点,遍历链表,删除节点,链表排序,链表逆序,销魂链表,获取链表长度
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
int id;
struct student* next;
}STU;
//创建头节点
STU* createchain()
{
//头节点
STU* head=NULL;
head = (STU*)malloc(sizeof(STU));
head->id = 0;
head->next = NULL;
return head;
}
//销毁链表
void freechain(STU* head)
{
STU* tmp = head;
STU* pnext;
while (tmp)
{
pnext = tmp->next;
free(tmp);
tmp = pnext;
}
}
//插入节点,尾插法
void insertnode(STU* head, STU data)
{
STU* tmp=head;
while (tmp->next)//求出链表尾节点
{
tmp = tmp->next;
}
tmp->next = (STU*)malloc(sizeof(STU));
tmp->next->id = data.id;
tmp->next->next = NULL;
}
//删除指定节点
void deletenode(STU* head, STU data)
{
STU* prev=head;
STU* tmp=head->next;
STU* next;
int flag = 0;
while (tmp->next)
{
if (tmp->id == data.id)
{
flag = 1;
break;
}
prev = prev->next;
tmp = tmp->next;
}
if (flag)
{
if (!tmp->next)//判断是不是最后一个节点
{
prev->next = NULL;
free(tmp);
}
else
{
next= tmp->next;
prev->next = next;
free(tmp);
}
}
else
{
//指定的数据不存在
return;
}
}
//获取链表长度
int countlen(STU* head)
{
int len = 0;
STU* tmp = head->next;
while (tmp)
{
len++;
tmp = tmp->next;////////////////////
}
return len;
}
//遍历链表
void foreach(STU* head)
{
STU* tmp=head->next;
if (tmp == NULL)
{
printf("chain has no content\n");
return;
}
while (tmp)
{
printf("tmp->id=%3d\n", tmp->id);
tmp = tmp->next;
}
}
//链表逆序
STU* reversal(STU* head)
{
STU* thead = head;
STU* prev=head->next;
STU* tmp = prev->next;////////////////////////////
STU* pnext=tmp->next;
STU* firstnode = head->next;
while (pnext)
{
tmp->next = prev;
prev = tmp;
tmp = pnext;
pnext = pnext->next;
}
tmp->next = prev;
thead->next = tmp;
firstnode->next = NULL;
return thead;
}
//按顺序插入
void insertbyid(STU* head,STU data)
{
STU* tmp;
STU* pnext=NULL;
tmp = head->next;
int flag = 0;
int F;
if (countlen(head) < 1)
{
F = 0;
}
else
{
F = 1;
pnext = tmp->next;
}
while (pnext && F)
{
if (tmp->id <= data.id && pnext->id >= data.id)
{
flag = 1;
STU* insertnode = (STU*)malloc(sizeof(STU));
insertnode->id = data.id;
tmp->next = insertnode;
insertnode->next = pnext;
break;
}
tmp = tmp->next;
pnext = pnext->next;
}
if (!flag)
{
STU* insertnode = (STU*)malloc(sizeof(STU));
insertnode->id = data.id;
insertnode->next = NULL;
if(!F)
{
head->next = insertnode;
}
else
{
tmp->next = insertnode;
}
}
}
//链表排序
STU* chainsort(STU* head)
{
int len = countlen(head);
if (len <= 1)
return NULL;
STU* tmp=head->next;
STU* rehead = (STU*)malloc(sizeof(STU));
rehead->next = NULL;
while (tmp)
{
insertbyid(rehead, *(tmp));
tmp = tmp->next;
}
freechain(head);
printf("after sort chain len =%d\n", countlen(rehead));
return rehead;
}
//
//
int main()
{
//创建头节点
STU* head = createchain();
//插入数据
STU S1, S2, S3, S4, S5, S6, S7, S8;
S1.id = 1;S2.id = 2;S3.id = 3;S4.id = 4;
S5.id = 8;S6.id = 7;S7.id = 6;S8.id = 5;
insertnode(head, S1);insertnode(head, S2);
insertnode(head, S3);insertnode(head, S4);
insertnode(head, S5);insertnode(head, S6);
insertnode(head, S7);insertnode(head, S8);
//求链表节点数
printf("count chain node:%d\n", countlen(head));
//打印链表
foreach(head);
//删除节点
deletenode(head, S3);
//打印链表
printf("--------------------------------------------------------\n");
foreach(head);
//求链表节点数
printf("count chain node:%d\n", countlen(head));
//链表排序
STU* sequence = chainsort(head);
//打印链表
foreach(sequence);
//链表逆序
STU* reverse_chain = reversal(sequence);
//打印链表
printf("after reverse\n");
foreach(reverse_chain);
//销毁链表
freechain(reverse_chain);
system("pause");
return 0;
}
- 链表的几种操作
- 对链表的几种简单操作
- DataView的几种操作
- 数据库的几种操作
- 单链表的几种操作
- Activity的几种操作
- mysql 跨表更新数据的几种操作
- 在OLTP中,表访问的几种常规操作
- 常用的几种文件读写操作
- javascript操作radio的几种方法
- C# 剪切板操作的几种方式
- 几种文件操作函数库的特点
- 常用的几种文件读写操作
- 操作xml的几种方法
- Json的几种简单操作
- java操作excel 的几种方法
- Java 文件操作的几种方式
- JDBC操作数据库的几种方式。
- JS刷新页面
- Java设计模式——单例模式(饿汉式、懒汉式)
- SQL删除重复数据只保留一条
- 画图板第二版本
- 选择排序(伪代码算法,c++,以及python实现)
- 链表的几种操作
- 解决爱加密加固之后使用xposed hook的时候log打印不出来的问题
- ThtinkPHP开启事务
- tensorflow36《TensorFlow实战》笔记-06-04 TensorFlow实现 ResNet code
- ST表浅谈
- 前端面试题汇总 作者: resharpe 链接:http://www.imooc.com/article/10057 来源:慕课网
- visualVM 使用 remote 连接远程机器上的Tomcat
- Vue全局变量的实现方式
- Java制作画图板(阶段二)