c实现一个存储int数据的列表
//列表体定义 typedef int Position;//自定义类型,用以表示列表中最后一个有效元素的位置 //typedef int ElementType;//定义数据类型,此处以int型为例,可自行定义为任何类型 typedef struct LNode //定义结构体 { ElementType Data[MAX_SIZE];//数据存储表 Position Last;//最后有一个有效元素的位置 } *List;//定义头指针 //列表操作方法定义 //**初始化方法 List makeEmpty()//初始化一个空列表 { List l;//定义头指针 l = (list)malloc(sizeof(LNode));//为列表分配内存空间 l->Last = -1;//空列表数据为空,有效元素位置设为-1 return l;//返回头指针 } //**查找元素位置 Position find(List l,ElementType x) { Position i = 0;//从第一个元素开始遍历 //此处可插入列表是否空判断 /* if(l->Last == -1)//若列表为空,结束 { return NULL; } */ while(i <= l->Last && l->Data == x)//遍历完或找到指定元素时结束遍历 { i++; } if(i > l->Last) { return NULL;//若为找到元素,返回NULL } else { return i;//若找到元素,返回其位置 } } //**插入元素 bool insert(List l,ElementType x,Position p)//在列表中p位置插入一个元素 { Position i; if(l->Last == MAX_SIZE - 1)//插入前判断列表是否满 { print("列表满"); return false; } if(p < 0 || p > l->Last + 1)//检测插入位置合法性,列表为连续排列的元素,不可跳跃 { print("位置非法"); return false; } for(i = l->Last; l >= p; i--)//遍历列表,移动元素,空出插入位置,列表向后增长,因此又后向前逐个后移,直到位置p { l->Data[i+1] = l->Data[i]; } l->Data[p] = x; l->Last++;//元素个数增加一 return true; } //**删除元素 bool delete(List l,Position p) { Position i; if(p < 0 || p > l->Last)//检查位置合法性 { print("位置不合法") } for(i = p + 1; i <= l->Last; i++)//将元素由后向前移动,即可覆盖指定元素,实现删除 { l->Data[i-1] = l->Data[i]; } l->Last--;//元素减一 }c实现一个存储int型数据的单向链表
typedef struct LNode *PtrToNode;//定义节点指针 typedef int ElementType;//此处以int为例 struct LNode//定义节点结构体 { ElementType Data;//存储的数据 PrtToNode Next;//指向下一个节点的指针 }; typedef PrtToNode Position;//定义节点位置指针 typedef PrtToNode List;//定义链表头指针 //其实,上面的和下面的定义是一样的, 之所以那么麻烦是为了更详细解释链表的不同部分,比如头节点和头指针,所以实现操作方法的时候我们依然以上面的为标准 /* typedef struct LNode *List;//定义节点指针 typedef int ElementType;//此处以int为例 struct LNode//定义节点结构体 { ElementType Data;//存储的数据 List Next;//指向下一个节点的指针 }; */ //**查找 Position find(Lsit l,Elementype x) { Position p = l;//指向链表第一个节点 while( p && p->Data == x)//遍历列表直到找到指定元素或遍历结束 { p = p->Next; } if(p)//如果找到指定元素, 即p不为NULL { return p; } else { return NULL; } } //**插入(带头节点) bool insert(List l,ElementType x,Position p) { Position temp,pre; //从头结点开始遍历链表,直到找到指定节点的前一个节点或遍历至结束 for(pre = l; pre && pre->Next != p;pre = pre->Next); /*用while实现 pre = l; while(pre && pre->Next != p) { pre = pre->Next; } */ if(pre == NULL)//未找到节点 { print("插入位置错误"); } else { temp = (Position)malloc(sizeof(LNode));//申请内存建立临时节点 temp->Data = x;//存储数据 temp->Next = p;//接入链表 pre->Next = temp; return true; } } //** 删除(带头节点) bool delete(List l, Position p) { Position pre; for(pre = l; pre && pre->Next != p;pre = pre->Next); //此处效果同上 if(pre == NULL || p == NULL)//若未找到节点 { print("位置参数错误"); return false; } else { pre->Next = p->Next; free(p);//释放p位置的节点的内存 return true; } }