数据结构之链表(头指针链表的插入、删除、逆序)

来源:互联网 发布:淘宝花溪都是什么牌子 编辑:程序博客网 时间: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
原创粉丝点击