#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;
 }
}

 

 

posted on 2019-08-10 23:33  渐凸强、啊哈  阅读(452)  评论(0编辑  收藏  举报