#include<stdio.h>#include<stdlib.h>typedefstructnode{int item;structnode*next;}node_t;
node_t *head =NULL;/*
定义节点
测试节点长度并强制转换为指针类型保持两边的类型一致
分配地址空间,如果空间为空结束程序
如果有空间将目标值放到空间中
将最后一个next赋值为空
*p是啥??
*/
node_t *mk_node(int item){
node_t *p =(node_t*)malloc(sizeof(node_t));if(p ==NULL){printf("malloc default!");exit(1);}
p->item = item;
p->next =NULL;}/*
有了创建节点的函数必须加上释放节点的函数
*/voidfree_node(node_t *p){free(p);}/*
将第二个元素插到第一个元素的前面
p在第一个的最前面这时head是空
将p的第二个元素指向第一个的head
将head指向p这时候head是第二个元素
*/voidinsert_node(node_t *p){
p->next = head;
head = p;}/*
查找函数
先将指针指向head
判断是否是空指针
如果p指向的item 是target
返回p如果不是就继续查找下一个
如果没有就返回空
*/
node_t *search(int target){
node_t *p = head;while(p !=NULL){if(target == p->item){return p;}
p = p->next;}returnNULL;}voidrm_node(node_t *p){
node_t *pre = head;if(p == head)//gaidong{
head = head->next;
p->next =NULL;return;}while( pre->next !=NULL){if(pre->next == p){
pre->next = p->next;return;}
pre = pre->next;}}voiddestroy(){
node_t *p;while(head !=NULL){
p = head;
head = head->next;free_node(p);}}/*
遍历性
先将head给指针
将检测到的每个item输出
将p指向下一个p
*/voidtraverse(){
node_t *p = head;while(p !=NULL){printf("%d",p->item);
p = p->next;}printf("\n");}voidreverse(){
node_t *nhead =NULL;
node_t *p;while(head !=NULL){
p = head;
head = head->next;
p->next = nhead;
nhead = p;}
head = nhead;}intmain(){
node_t *p;int target;
p =mk_node(1);insert_node(p);
p =mk_node(2);insert_node(p);
p =mk_node(3);insert_node(p);
p =mk_node(4);insert_node(p);traverse();printf("please give me a number !\n");scanf("%d",&target);
p =search(target);if(p ==NULL){printf("can't find %d\n",target);}else{printf("%p %d %d\n",p,target,p->item);rm_node(p);free_node(p);}traverse();reverse();traverse();destroy();traverse();return0;}
双向链表
#ifndefDOUBLYLINKEDLIST_H#defineDOUBLYLINKEDLIST_Htypedefstructnode*link;structnode{unsignedchar item;
link prev, next;};
link make_node(unsignedchar item);voidfree_node(link p);
link search(unsignedchar key);voidinsert(link p);voiddelete(link p);voidtraverse(void(*visit)(link));voiddestroy(void);voidenqueue(link p);
link dequeue(void);#endif
#include<stdio.h>#include"doublylinkedlist.h"//声明 voidprint_item(link p){printf("%d\n", p->item);}intmain(void){
link p =make_node(10);insert(p);
p =make_node(5);insert(p);
p =make_node(90);insert(p);
p =search(5);delete(p);free_node(p);traverse(print_item);destroy();
p =make_node(100);enqueue(p);
p =make_node(200);enqueue(p);
p =make_node(250);enqueue(p);while(p =dequeue()){print_item(p);free_node(p);}return0;}
#include<stdlib.h>#include"doublylinkedlist.h"//引用自身 structnode tailsentinel;structnode headsentinel ={0,NULL,&tailsentinel};structnode tailsentinel ={0,&headsentinel,NULL};static link head =&headsentinel;static link tail =&tailsentinel;
link make_node(unsignedchar item){
link p =malloc(sizeof*p);
p->item = item;
p->prev = p->next =NULL;return p;}voidfree_node(link p){free(p);}
link search(unsignedchar key){
link p;for(p = head->next; p != tail; p = p->next){if(p->item == key)return p;}returnNULL;}voidinsert(link p){
p->next = head->next;
head->next->prev = p;
head->next = p;
p->prev = head;}voiddelete(link p){
p->prev->next = p->next;
p->next->prev = p->prev;}voidtraverse(void(*visit)(link)){
link p;for(p = head->next; p != tail; p = p->next){visit(p);}}voiddestroy(void){
link q, p = head->next;
head->next = tail;
tail->prev = head;while(p != tail){
q = p;
p = p->next;free_node(q);}}voidenqueue(link p){insert(p);}
link dequeue(void){if(tail->prev == head){returnNULL;}else{
link p = tail->prev;delete(p);return p;}}