#include<iostream> #include<malloc.h> using namespace std; typedef int ElemType; //结点结构 typedef struct node{ ElemType data; struct node *next; }SLink; //初始化链表 void InitSLink(SLink *&L){ //这个为头结点分配一个内存 L=(SLink *)malloc(sizeof(SLink)); //指向NULL L->next = NULL; } //销毁链表 void DestrorySLink(SLink *&L){ //指针别名 SLink *pre=L,*p=L->next; while(p!=NULL){ free(pre); pre=p; p=p->next; }//销毁最后的结点 free(pre); } //因为要判断是否删除成功函数返回值应该整型 注意这里可以使用指针的别名或者直接传递 反正指向的是同一个内存空间 int InsElem(SLink *L,ElemType a,int r){ //注意一点 线性表当中的数组 下标是固定从0 //开始,而链表不是应该从实际上考虑 //注意一个问题:插入第r个位置 也就是除了头结点开始的元素结点第r个位置 也就是先找到第r-1个元素结点也就是先找到整条单链表的第r个元素 也就是实际顺序上的第r-1个元素 int i=0; SLink *p = L; //找到r-1个元素 while(p!=NULL&&i<r-1){ i++; p=p->next; } if(p==NULL){ return 0; } //创建一个节点 将节点插在当前节点的后面 SLink *s= (SLink *)malloc(sizeof(SLink)); s->next = p->next; s->data = a; p->next=s; return 1; } //删除元素 int DelElem(SLink *&L,int r){ //不能删除0节点 if(r<=0){ return 0; } //从第一个节点开始 int j=1; SLink *p=L->next,*q; //找到他的前节点 while(p!=NULL&&j<r-1){ p=p->next; } //不存在该节点的前节点 if(p==NULL){ return 0; } //p->next = (p->next)->next;错误写法这里赋值完后无法释放要删除的节点内存 q=p->next; p->next=q->next; cout<<q->data; cout<<p->data; free(q); return 1; } //定位元素 int LocElem(SLink *&L,ElemType a){ int i=1; SLink *p=L->next; while(p->data!=a&&p->next!=NULL){ i++; p=p->next; } if(p->next==NULL){ return 0; } //返回元素的值 return i; } void DisSLink(SLink *&L){ SLink *p=L->next; cout<<"链表的值如下"<<endl; while(p!=NULL){ cout<<p->data<<" "; p=p->next; } cout<<endl; } //获得某个位置元素的值 int LocaElem(SLink *&L,int r){ if(r<=0){ return 0; } int i=1; SLink *p=L->next; while(p!=NULL&&i!=r){ i++; p=p->next; } if(p==NULL){ cout<<"该位置不存在元素"<<endl; }else{ cout<<"位于链表"<<r<<"处为:"<<p->data<<endl; } } int GetLength(SLink *&L){ int i=0; SLink *p=L->next; while(p!=NULL){ i++; p=p->next; } return i; } int main(){ /* 带头结点不循环单链表 基本算法: 初始化链表InitSLink() 销毁链表DestrorySLink() 插入元素InsElem 删除元素DelElem 获得某个位置的元素GetElem 输出元素DisSLink 获得元素的位置LocaElem 获取链表长度GetLength */ SLink *L; //初始化 InitSLink(L); //插入元素 InsElem(L,32,1); InsElem(L,2,2); InsElem(L,3,3); InsElem(L,12,4); InsElem(L,22,5); InsElem(L,42,6); InsElem(L,3,7); LocaElem(L,5); LocaElem(L,12); cout<<"当前有"<<endl; DisSLink(L); cout<<"删除第二个元素"<<endl; cout<<(DelElem(L,2)?"成功":"失败")<<endl; cout<<"现在存在的元素"<<endl; DisSLink(L); cout<<"链表当前长度"<<GetLength(L)<<endl; cout<<"元素3的位置是"<<LocElem(L,3)<<endl; return 0; }
执行结果:
[root@VM_0_11_centos gcc]# ./51.c 位于链表5处为:22 该位置不存在元素 当前有 链表的值如下 32 2 3 12 22 42 3 删除第二个元素 232成功 现在存在的元素 链表的值如下 32 3 12 22 42 3 链表当前长度6
元素3的位置是2
[root@VM_0_11_centos gcc]#
一次性创建并且插入结点
//头插法 void Inithead(SLink *&L,ElemType a[],int l){ L=(SLink *)malloc(sizeof(SLink)); L->next=NULL; //创建的结点 SLink *s; for(int i=0;i<l;i++){ s=(SLink *)malloc(sizeof(SLink)); s->data=a[i]; s->next=L->next; L->next=s; } } //尾插发 void Initfoot(SLink *&L,ElemType a[],int l){ L=(SLink *)malloc(sizeof(SLink)); //L->next=NULL; SLink *foot=L,*s;//这个应该卸载分配内存之后 for(int i=0;i<l;i++){ s=(SLink *)malloc(sizeof(SLink)); //在原尾结点指向新插入的结点 //s->next=NULL; s->data=a[i]; foot->next=s; //尾部指针指向新插入的结点 foot=s; } foot->next=NULL; }
获得最大结点:
//获得最大节点 void GetMax(SLink *&L){ //先假定当前元素为最大节点 int l=0,maxl=0; SLink *p = L->next,*max=p; while(p!=NULL){ l++; if(p->data > max->data){ max=p; //最大元素的位置 maxl=l; } p=p->next; } if(max==NULL){ cout<<"当前空链"<<endl; }else{ cout<<"最大节点位于"<<maxl<<"的"<<max->data<<endl; } }