西卡学院单链表的实现(带空表头的实现)
来源:互联网 发布:e8票据打印软件 编辑:程序博客网 时间:2024/04/30 11:46
纠结写了一上午没啥进展,把别人的代码贴出来。要努力了的。
list.h
#define NULL 0#define ElementType inttypedef struct _ChainNode{ ElementType data; struct _ChainNode * next;}ChainNode;typedef struct{ ChainNode * head; ChainNode * tail; int total;}List ;List * ListInit();int ListDestory(List * lp);int ListClear(List * lp);int InsertTail(List * lp , ElementType * pdata);int InsertHead(List * lp , ElementType * pdata);int InsertNode(List * lp , int n , ElementType * pdata);int RemoveNode(List * lp , int n);ChainNode * GetChainNode(List * lp , int n);ChainNode * NewChainNode(ElementType * pdata);ChainNode * GetAddr(List * lp , int n);int IsEmpty(List * lp);int GetTotal(List * lp);int ListTraverse(List * lp , int (*fpn)(ElementType * pdata));
list.c实现:
#include "list.h"#include <malloc.h>#include <string.h>#include <stdio.h>ElementType mydata;List * ListInit() { List * lp = NULL; ChainNode * newp = NULL; lp = (List *)malloc(sizeof(List)); if(!lp) return lp; newp = NewChainNode(&mydata); if(!newp) { free(lp); lp = NULL; return lp; } lp->head = lp->tail = newp; lp->total = 0; return lp;}int ListDestory(List * lp) { if(!lp) { ListClear(lp); free(lp->head); free(lp); } return 1;}int ListClear(List * lp){ while(RemoveNode(lp,1)); return 1;}int InsertTail(List * lp , ElementType * pdata) { ChainNode * newp = NULL; newp = NewChainNode(pdata); if(!newp) return 0 ; lp->tail->next = newp; lp->tail = newp; lp->total++ ; return 1 ;}int InsertHead(List * lp , ElementType * pdata) { ChainNode * newp = NULL; newp = NewChainNode(pdata); if(!newp) return 0; newp->next = lp->head->next; lp->head->next = newp; lp->total++; return 1;}int InsertNode(List * lp , int n , ElementType * pdata) { ChainNode * newp = NULL; ChainNode * p = NULL; newp = NewChainNode(pdata); if(!newp) return 0 ; p = GetAddr(lp,n-1); newp->next = p->next; p->next = newp; lp->total++; return 1 ;}int RemoveNode(List * lp , int n) { ChainNode * p = NULL; ChainNode * p1 = NULL; if(IsEmpty(lp) || n < 0 || n > lp->total) return 0; p = GetAddr(lp,n-1); if(!p) return 0 ; p1 = p->next; p->next = p1->next; free(p1); lp->total--; return 1;}ChainNode * GetChainNode(List * lp , int n){ return GetAddr(lp,n);}ChainNode * NewChainNode(ElementType * pdata){ ChainNode * newp = NULL; newp = (ChainNode *)malloc(sizeof(ChainNode)); if(!newp) return newp; memcpy(&newp->data,pdata,sizeof(ElementType)); newp->next = NULL; return newp;}ChainNode * GetAddr(List * lp , int n) { int i; ChainNode * p = NULL; if(IsEmpty(lp) || n < 0 || n > lp->total) return p ; for(i = 0 ,p = lp->head ; p && i <n ; i++,p = p->next); return p;}int IsEmpty(List * lp){ return lp->head->next == NULL;}int GetTotal(List * lp){ return lp->total ; }int ListTraverse(List * lp , int (*fpn)(ElementType * pdata)) { ChainNode * p = NULL; for(p = lp->head->next ; p ; p = p->next) { fpn(&p->data); } printf("\n"); return 1;}
mian函数的调用:
#include "list.h"#include <stdio.h>int showlist(ElementType * pdata){ printf("%d ",*pdata); return 1;}int main(){ int a[] = {1,2,3,4,5,6,7,8,9,10,11,12}; int data = 99 , data1 =100; int i = 0 ; List * lp = ListInit(); if(!lp) return 0 ; for(i=0;i<12;i++) { InsertTail(lp,a+i); } ListTraverse(lp,showlist); InsertNode(lp,1,&data); InsertNode(lp,13,&data); ListTraverse(lp,showlist); InsertHead(lp,&data1); ListTraverse(lp,showlist); printf("Total = %d \n",GetTotal(lp)); printf("GetChainNode No.%d is : %d \n",GetTotal(lp),GetChainNode(lp,GetTotal(lp))->data); RemoveNode(lp,1); RemoveNode(lp,13); RemoveNode(lp,12); ListTraverse(lp,showlist); printf("Total = %d \n",GetTotal(lp)); ListClear(lp); printf("Total = %d \n",GetTotal(lp)); ListDestory(lp); lp = NULL ; return 1 ;}
- 西卡学院单链表的实现(带空表头的实现)
- C++实现带表头的单链表
- 带表头的单向链表实现(C语言)
- 带表头的单链表算法分析(前插法示例,C语言实现)
- 带表头的单循环链表的实现
- 带表头的线性链表的实现
- C++类模版:带表头链表的实现
- (整理)Java实现链表的增加和删除(表头不为空)
- c实现带表头的单链表的创建、测长及打印
- 单链表的逆序(不带表头)
- 带合计行的多层表头(多行表头/多维表头)组件TDataGridViewEx实现兼假期总结
- 公共代码帮助类:下载页面、导出Excel(不带表头)、导出Execl(带表头)、 导出CSV、实现对IList到DataSet的转换
- UltraWebGrid多表头的实现
- 实现DataGridView的多层表头
- ALV双表头的实现
- ABAP ALV表头的实现
- DataGridView合并表头实现 、二维表头的实现
- DataGridView合并表头实现 、二维表头的实现、单元格合并
- NDK 编译中so的名字不要用下划线哦
- hoho
- Android Camera 使用小结
- QML与Qt C++ 交互机制探讨与总结
- getaddrinfo()函数详解
- 西卡学院单链表的实现(带空表头的实现)
- netfilter模块及iptables基本概念
- ASP静态化后,静态html页面点击计数解决方法
- TPS
- 程序运行时,对象是怎么进行放置的呢?特别是内存是怎么分配的呢?
- 开发网址收集
- 简单的懒加载图片数据
- 回首过去的那些事儿(4)
- MFC树控件