此链表实现书籍信息管理
功能:创建链表、头插(尾插)、按条件删除(.c文件实现按书名删除节点)、删除指定节点、查找结点、销毁链表
list.h
#ifndef DATATYPE #define DATATYPE int #endif typedef DATATYPE datatype; typedef struct node { //数据域 datatype data; //指针域 struct node *next; //后继指针,指向下一个与当前类型一致的成员 struct node *prev; //前驱指针 } listnode, *linklist; //通用型链表初始化 static linklist List_Init() { linklist Head = malloc(sizeof(listnode)); Head->next = Head; Head->prev = Head; return Head; } //通用型链表头插操作 static void HeadInsert(linklist Head, datatype info) { linklist Newnode = malloc(sizeof(listnode)); //数据域 Newnode->data = info; //指针域 Newnode->next = Head->next; Head->next = Newnode; Newnode->next->prev = Newnode; Newnode->prev = Head; } //通用型链表尾插操作 static void TailInsert(linklist Head, datatype info) { linklist Newnode = malloc(sizeof(listnode)); //数据域 Newnode->data = info; //指针域 Newnode->next = Head; Head->prev->next = Newnode; Newnode->prev = Head->prev; Head->prev = Newnode; } //通用型链表遍历操作 static void List_brow(linklist Head, void (*pfunction)(datatype)) { linklist temp = Head->prev; while (temp != Head) { pfunction(temp->data); temp = temp->prev; } } //通用型链表删除节点操作 static void List_Nulldelete(linklist Node) { Node->next->prev = Node->prev; Node->prev->next = Node->next; free(Node); } //通用型链表按条件删除节点操作 static void List_Havedelete(linklist Head, linklist (*fun)(linklist)) { linklist temp = fun(Head); if (temp != NULL) { temp->prev->next = temp->next; temp->next->prev = temp->prev; free(temp); printf("删除成功!\n"); } else printf("删除失败!\n"); } //通用型链表查找节点操作 static void List_Search(linklist Head, linklist (*fun)(linklist)) { linklist temp = fun(Head); if (temp != NULL) { printf("查找成功!\n"); } else printf("查找失败!\n"); } //通用型链表销毁操作 static void List_Destroy(linklist Head) { linklist p = Head; linklist q = p->next; int i = 0; while (q != Head) { p = q; free(p); i++; q = q->next; } free(Head); printf("成功释放%d个节点\n", i); }
list.c
#include <stdio.h> #include <stdlib.h> #include <string.h> struct book { char bookname[64]; char Author[64]; float price; }; #define DATATYPE struct book #include "double_list.h" //打印节点内容 void pridata(datatype binfo) { printf("%s\t%s\t%.1f\n", (binfo).bookname, (binfo).Author, (binfo).price); } //按书名查找节点 linklist Search(linklist Head) { //查找 char buf[32] = {0}; printf("输入你想要查找(删除)的书名:"); scanf("%s", buf); linklist temp = Head->next; int flag = 0; while (temp != Head) { if (strcmp(temp->data.bookname, buf) == 0) { return temp; flag = 1; break; } temp = temp->next; } if (flag == 0) return NULL; } int main() { //创建空表 struct node *head = List_Init(); datatype binfo; //尾插 for (int i = 0; i < 3; i++) { scanf("%s %s %f", binfo.bookname, binfo.Author, &binfo.price); while (getchar() != '\n') ; //清空\n TailInsert(head, binfo); } //按条件删除 List_Havedelete(head, Search); //删除指定节点 //List_Nulldelete(head->prev); //使用通用型的链表遍历函数,实现每找到一个节点 调用一次回调函数,处理找到的当前节点 List_brow(head, pridata); //查找结点 List_Search(head, Search); //销毁节点 List_Destroy(head); return 0; }