/*****************************//** 单链表的各种操作 **//** By www.fishc.com 小甲鱼 **//*****************************/#include #include typedef int ElemType;typedef struct node{ ElemType data; // 数据域 struct node *next; // 指针域}Node, *LinkList;// 函数功能:创建链表// 参数n:链表元素个数LinkList CreateLinkList(int n){ LinkList p, r, list = NULL; ElemType e; int i; for( i=1; i <= n; i++ ) { scanf("%d", &e); p = (LinkList)malloc(sizeof(Node)); p->data = e; p->next = NULL; if( !list ) { list = p; // 赋值链表头指针 } else { r->next = p; // 将结点一个个放入链表 } r = p; } return list; // 返回头指针}// 函数功能:插入元素到链表// 参数*list:链表指针// 参数q:链表当前位置// 参数e:待插入的元素void InsertList(LinkList *list, LinkList q, ElemType e){ LinkList p; p = (LinkList)malloc(sizeof(Node)); p->data = e; if( !*list ) // 如果是空链表 { *list = p; p->next = NULL; } else { p->next = q->next; q->next = p; }}// 函数功能:在链表中删除一个元素// 参数*list:链表指针// 参数q:链表当前位置void DelLink(LinkList *list, LinkList q){ LinkList r; if( q == *list ) // 如果删除的是第一个结点 { *list = q->next; free(q); } else { for( r=*list; r->next != q; r=r->next ) ; if( r->next != NULL ) { r->next = q->next; free(q); } }}// 函数功能:销毁一个链表// 参数*list:链表指针void DestroyLinkList(LinkList *list){ LinkList p, q; p = *list; while( p ) { q = p->next; free(p); p = q; } *list = NULL;}// 小甲鱼温馨提示:学习链表如果遇到思路上的困难,// 可以模仿小甲鱼在视频中画图来理清思路,效果不错!int main(){ int e, i; LinkList l, q; q = l = CreateLinkList(1); // 创建一个结点的链表// 小甲鱼提示:为什么下边不用do{...}while(e);的形式 printf("请输入即将插入链表的元素,输入0表示结束!\n"); scanf("%d", &e); while( e ) { InsertList(&l, q, e); q = q->next; scanf("%d", &e); } q = l; printf("链表的内容是:"); while( q ) { printf("%d ", q->data); q = q->next; } q = l; printf("\n\n删除第五个元素。。。\n"); for( i=0; i < 4; i++ ) { q = q->next; } DelLink(&l, q); q = l; printf("链表的内容是:"); while( q ) { printf("%d ", q->data); q = q->next; } DestroyLinkList(&l); return 0;}