数据结构之链表(头节点链表)

来源:互联网 发布:程序员和产品经理段子 编辑:程序博客网 时间:2024/05/16 04:14

头节点链表指的是带头节点的链表,这里介绍的是单链表,相比较头指针链表,好处就是插入删除不需要考虑空表的问题,操作不需要改变头指针,不用传二级指针。使用比较方便,也很广泛。

下面是关于头节点链表的一些操作的实现。(包括头文件与源文件)

头文件: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;//创建链表LinkList *Create_List();//头插法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);// 删除指定数据int Delete_Data(LinkList *h, LinkData data);// 查找元素:如果有, 返回元素的位置int Find_Element(LinkList* h, LinkData data, int *x);// 获取顺序表中的元素:通过位置获取int Get_Element(LinkList *h, int Pos, LinkData *data);//获取链表长度int Get_Len(LinkList *h,int *len);//链表排序int Order_List(LinkList *h)// 清空所有结点int Clean_List(LinkList *h);// 销毁链表int Destroy(LinkList *h);//打印链表void Display(LinkList *h);#endif

源文件:LinkList.c

#include <stdio.h>#include <stdlib.h>#include "LinkList.h"//创建链表LinkList *Create_List(){LinkList *head = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));if (head == NULL){return NULL;}head -> next = NULL;return head;}//尾插法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;while (tmp -> next){tmp = tmp -> next;}tmp -> next = node;return TRUE;}//头插法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 -> next;h -> next = node;return TRUE;}//在第Pos个节点处插入,从1开始,没有第0个节点,头节点不算intInsert_Pos(LinkList *h,int Pos,LinkData data){if (h == NULL || Pos < 1){return FALSE;}int i;LinkList *tmp = h;for (i = 0;i < Pos -1;i++){tmp = tmp -> next;if(tmp == NULL){printf ("插入位置越界\n");return FALSE;}}LinkList * node = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));if (node == NULL){return FALSE;}node -> data = data;node -> next = tmp -> next;tmp -> next = node;return TRUE;}//删除第Pos个节点,从1开始,没有第0个节点,头节点不算int Delete_Pos(LinkList *h,int Pos){if (h == NULL || Pos < 1){return FALSE;}int i;LinkList *tmp = h;for (i = 0;i < Pos -1;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->next == NULL || h->next->next == NULL){return FALSE;}LinkList *pre = h -> next;LinkList *cur = h -> next -> next;LinkList *tmp;while (cur){tmp = cur -> next;cur -> next = pre;pre = cur;cur = tmp;}h -> next -> next = NULL;h -> next = pre;return  TRUE;;}// 删除指定数据int Delete_Data(LinkList *h, LinkData data){if(h == NULL){return FALSE;}LinkList *tmp = h;while (tmp -> next){if (tmp -> next -> data == data){LinkList *p = tmp -> next;tmp -> next = p -> next;free (p);return TRUE;}tmp = tmp -> next;}printf ("删除失败,没有找到该数\n");return FALSE;}// 查找元素:如果有, 返回元素的位置int Find_Element(LinkList* h, LinkData data, int *x){if(h == NULL || x == NULL){return FALSE;}LinkList *tmp = h -> next;int count = 1;while (tmp){if (tmp -> data == data){*x = count;return TRUE;}tmp = tmp -> next;count++;}printf ("查找失败,没有找到该数\n");return FALSE;}// 获取顺序表中的元素:通过位置获取int Get_Element(LinkList *h, int Pos, LinkData *data){if(h == NULL || Pos < 1 ||data == NULL){return FALSE;}int i;LinkList *tmp = h;for (i = 0;i < Pos;i++){tmp = tmp -> next;if(tmp == NULL){printf ("查找位置越界\n");return FALSE;}}*data = tmp -> data;return TRUE;}//获取链表长度int Get_Len(LinkList *h,int *len){if(h == NULL || len == NULL){return FALSE;}int count = 0;LinkList *tmp = h;while(tmp -> next){tmp = tmp -> next;count++;}*len = count;return TRUE;}//链表排序int Order_List(LinkList *h){if(h == NULL || h -> next == NULL || h -> next -> next == NULL){return FALSE;}int len;Get_Len(h,&len);LinkList * tmp = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));if (tmp == NULL){return FALSE;}int i,j;for (i = 1;i < len;i++){LinkList* min = h -> next;LinkList* max = h -> next -> next;for (j = 1;j < len - i + 1;j++){if (min -> data > max -> data){tmp -> data = min -> data;min -> data = max -> data;max -> data = tmp -> data;}min = min -> next;max = max -> next;}}free (tmp);return TRUE;}// 清空所有结点int Clean_List(LinkList *h){if(h == NULL){return FALSE;}LinkList *tmp = h;while (tmp -> next){Delete_Pos(h,1);}return TRUE;}// 销毁链表int Destroy(LinkList *h){if(h == NULL){return FALSE;}Clean_List(h);free (h);return TRUE;}//打印链表void Display(LinkList *h){if (h == NULL){printf ("没有头节点\n");return;}int count = 0;LinkList *tmp = h -> next;while(tmp){if(count++ % 4 == 0){printf ("\n");}printf ("%8d",tmp -> data);tmp = tmp -> next;}printf ("\n");}

关于头节点链表的更多的功能,可以大家一起去实现。

原创粉丝点击