数据结构之链表(头指针链表的插入、删除、逆序)
来源:互联网 发布:淘宝花溪都是什么牌子 编辑:程序博客网 时间:2024/05/24 15:42
链表也是一种线性表,区别于顺序表,链表是一种物理上不连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。头指针链表指不带头节点的链表,这样的链表在插入时需要考虑空表的情况,指定位置删除插入时也需要考虑是否在第一个节点处。因为头指针链表的很多操作都需要改变头指针。
下面是关于头指针链表的一些操作的实现。(包括头文件与源文件)
头文件:LinkList.h
#ifndef __LINKLIST_H__#define __LINKLIST_H__#define TRUE 1#define FALSE 0typedef int LinkData;typedef struct _node{LinkData data;struct _node *next;}LinkList;//头插法intInsert_Head(LinkList **h,LinkData data);//尾插法intInsert_Last(LinkList **h,LinkData data);//在第Pos个节点处插入,从1开始,没有第0个节点intInsert_Pos(LinkList **h,int Pos,LinkData data);//删除第Pos个节点,从1开始,没有第0个节点int Delete_Pos(LinkList **h,int Pos);//逆序链表int Reverse_List(LinkList **h);//打印链表void Display(LinkList *h);#endif
源文件:LinkList.c
#include <stdio.h>#include <stdlib.h>#include "LinkList.h"//头插法intInsert_Head(LinkList **h,LinkData data){if (h == NULL){return FALSE;}LinkList * node = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));if (node == NULL){return FALSE;}node -> data = data;node -> next = *h;*h = node;return TRUE;}//尾插法intInsert_Last(LinkList **h,LinkData data){if (h == NULL){return FALSE;}LinkList * node = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));if (node == NULL){return FALSE;}node -> data = data;node -> next = NULL;LinkList *tmp = *h;if (tmp == NULL){*h = node;}else{while(tmp -> next){tmp = tmp -> next;}tmp -> next = node;}return TRUE;}//在第Pos个节点处插入,从1开始,没有第0个节点intInsert_Pos(LinkList **h,int Pos,LinkData data){if(h == NULL || Pos < 1){printf ("插入失败\n");return FALSE;}LinkList * node = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));if (node == NULL){return FALSE;}node -> data = data;if (*h == NULL) //空表{if (Pos != 1){printf ("当前为空表,无法在第%d个节点位置插入\n",Pos);free (node);return FALSE;}node -> next = NULL;*h = node;}else{if (Pos == 1){node -> next = *h; *h = node;}else{LinkList *tmp = *h;int i;for (i = 0;i < Pos - 2;i++){tmp = tmp -> next;if (tmp == NULL){printf ("插入越界\n");free (node);return FALSE;}}node ->next = tmp -> next;tmp -> next = node;}}return TRUE;}//删除第Pos个节点,从1开始,没有第0个节点int Delete_Pos(LinkList **h,int Pos){if (h == NULL || *h == NULL || Pos < 1){printf ("删除失败\n");return FALSE;}LinkList *tmp = *h;if (Pos == 1){*h = (*h) -> next;free(tmp);}else{LinkList *tmp = *h;int i;for (i = 0;i < Pos - 2;i++){tmp = tmp -> next;if (tmp -> next == NULL){printf ("删除越界\n");return FALSE;}}LinkList *p = tmp -> next;tmp -> next = p -> next;;free (p);}return TRUE;}//逆序链表int Reverse_List(LinkList **h){if (h == NULL || *h == NULL || (*h) -> next == NULL){printf ("逆序失败\n");return FALSE;}LinkList *pre = *h;LinkList *cur = (*h) -> next;LinkList *tmp;while(cur){tmp = cur -> next;cur -> next = pre;pre = cur;cur = tmp;}(*h) -> next = NULL;(*h) = pre;return TRUE;}//打印链表void Display(LinkList *h){if (h == NULL){return;}int count = 0;while(h){if(count++ % 4 == 0){printf ("\n");}printf ("%8d",h -> data);h = h -> next;}printf ("\n");}
关于头指针链表的更多的功能,可以大家一起去实现。
阅读全文
0 0
- 数据结构之链表(头指针链表的插入、删除、逆序)
- 数据结构之头指针链表的逆序、输出和指定位置的删除
- C数据结构链表的插入,删除,逆序…
- 数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)
- 链表的创建,插入,删除,逆序
- 数据结构之头指针链表de三种插入方式(头插法,尾插法,在pos处插入)
- 链表插入与删除操作中的头、尾指针
- 数据结构头指针链表
- 数据结构中 链表的创建,值的插入以及删除(一定注意头结点的作用)
- 【数据结构】用C++实现单循环链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- 【数据结构】用C++实现双循环链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- 链表的创建,删除,插入,逆序,打印
- 数据结构之头结点链表的三种插入方式(头插法,尾插法,在pos处插入)
- 数据结构之链表(一)创建,插入,删除
- 链表的插入、删除、逆序打印、输出倒数第N个、链表逆序
- 【数据结构】用C++实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- 数据结构之链表:实现单链表的逆序 (1)
- 循环链表的创建、插入、删除、逆序、显示(C++实现)
- 什么叫WebRTC
- 自卑与超越-现代修心有声小说
- Vue 折腾记
- C
- java web 笔记(二):登录认证系统
- 数据结构之链表(头指针链表的插入、删除、逆序)
- Blade模板引擎教程-常用语法格式
- HDU-3749 Financial Crisis(并查集+点双连通分量)
- c++数组的初始化
- id锚点定位并加上偏移量的
- 前端-<基础>-px,ppi,DPR,解决iphone适配问题
- CF494B Obsessive String(KMP+DP)
- JAVA设计模式
- UVA1374PowerCalculus