1、head.h
//文件名:head.h //预定义常量及常用头文件 #include<stdio.h> #include<string.h> #include<ctype.h> #include<malloc.h> #include<math.h> #include<process.h> #define TURE 1; #define FALSE 0; #define OK 1; #define ERROR 0; #define INFEASIBLE -1;//不可行 typedef int Status;//Status是函数的类型,其值是函数结果的状态代码,如OK等 typedef int Boolean;//布尔类型,值为TURE 或 FALSE typedef int ElemType;//数据元素定义,用户在使用该数据类型也可自行定义
2、单链表
//文件名:linklist.h #include"head.h" typedef struct LNode { int data; struct LNode*next; }LNode,*LinkList; //LinkList L:L是一个指向LNode类型变量的指针 //1、初始化 //函数:InitList(LinkList &L) //功能:构造一个空单链表,指分配一个节点的存储空间,并令指针域节点为空 void InitList(LinkList &L) { L=(LinkList)malloc(sizeof(LNode));//??? if(!L)exit(1); //exit():用在子程序中终结程序用的,exit(0):表示正常退出;exit(1):表示异常退出 L->next=NULL; } //2、求链长 //函数:ListLenth(LinkList L) //功能:返回带头节点单链表长度 int ListLenth(LinkList L) { int len=0; LinkList p=L->next; while(p!=NULL) { ++len; p=p->next; } return len; } //3、判断空 //函数:ListEmpty(LinkList L) //功能:判断单链表是否为空 int ListEmpty(LinkList L) { if(L->next==NULL)return TURE; return FALSE; } //4、取元素 //函数:GetELem(LinkList L,int i,ElemType &e) //功能:当第i个元素存在时,赋值给e,返回1,否则返回0; int GetELem(LinkList L,int i,ElemType &e)//ELemType为元素类型,用户自定(默认int) { //int &e为引用,效果相当于int *e,详见博客。 //L:带头节点的单链表的头指针 int j; LinkList p; p=L->next;j=1;//初始化p指向第一个节点,j:节点计数器 while(p||j<i)//顺着指针向后查找,直到p指向第i个元素或p为空 { p=p->next; j++; } if(!p||j>i)return ERROR; e=p->data; return OK; } //5、插入节点 //函数:ListInsert(LinkList &L,int i,ElemType e) //功能:在带头节点的单链表L第i-1与i个位置之间插入元素e int ListInsert(LinkList &L,int i,ElemType e) { LinkList p=L,s; int j=0; while (p||j<i-1) { p=p->next; j++;}//寻找第i-1个节点 if(!p||j>i-1)return ERROR; s=(LinkList)malloc(sizeof(LNode));//创建新节点 s->data=e; s->next=p->next; //插入 p->next=s; return OK; } //6、删除节点 //函数:ListDelete(LinkList &L,int i,ElemType &e) //功能:删除带头节点的单链表L的第i个节点,并用e返回被删除节点的值 int ListDelete(LinkList &L,int i,ElemType &e) { LinkList p=L,q; int j=0; while (p||j<i-1) { p=p->next; j++;}//寻找第i-1个节点 if(!p||j>i-1)return ERROR; q=p->next; p->next=q->next; e=q->data; free(q); return OK; } //7、按值查找 //书有错,自改之 //函数:LocateElem(LinkList L,ElemType e) //功能:按值查找,从头指针开始遍历,依次将被遍历到的结点的值与给定值比较, //如果相等返回首次出现与给定值相等的数据元素序号,成为查找成功,否则返回0表示失败。 int LocateElem(LinkList L,ElemType e) { int i=1; LinkList p=L->next;//p的初值为第一个节点的指针 while (p&&p->data!=e) { ++i; p=p->next; } if(i<=ListLenth(L))return i; else return 0; } //8、新建链表 //函数:CreateList(LinkList &L,int n) //功能:逆序输入n个元素的值,建立带表头节点的单链表La void CreateList(LinkList &L,int n) { LinkList p;int i; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; //这两句给初始化了个带头节点的空单链表,L定义完就行,不用InitList for(i=n;i>0;i--) { p=(LinkList)malloc(sizeof(LNode));//产生新节点 scanf("%d",&p->data); //输入元素值 p->next=L->next; //插入到表头 L->next=p; } }
3、
4、
原文:https://www.cnblogs.com/xvfang/p/15028356.html