严蔚敏版数据结构——单链表的操作
记得前上个礼拜,我写过的一个版本的单链表的创建。今天写下了这个严蔚敏版的单链表。梳理了一下思路,其基本算法还是一样的,还是那句话,理解,理解,理解最重要。这个版本的单链表我要提醒自己的是:1、这是直接在函数中采用引用LinkList & (注意这是引用,不是取指针地址) 对地址进行操作;上个版本是函数返回一个指向结构体指针的指针这种方法;(我还要说明一点:如果这两种方法都不采用,那就要用指向指针的指针,双重指针来操作,当然这是很复杂哦,因为我们的链表说到底就是一个指针,一般我们采用以上两种方法即可)2、记住一点,不改变链表参数传值就行,即链表就行(LinkList head),要操作链表最简单一种做法就是用引用的方法传地址,这不是——指向结构体LNode的指针的地址,而是引用、引用、引用。详情参考下一篇博客 int & 到底是个啥(LInkList & head)。
还是那句话,代码是最精简的解释,上代码欣赏。
代码亲测完美运行:
/*
item是暂时用来遍历元素的指针
pnew是新创建的结点指针
pend是链表的尾结点
*/
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
//---------------前插法创建单链表;----------------
void CreatList_H(LinkList &head,int n)
{
int i;LinkList pnew;
//先建立头结点,数据为空;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
for(i=0;i<n;i++)
{
pnew=(LinkList)malloc(sizeof(LNode));
scanf("%d",&pnew->data);
pnew->next=head->next;
head->next=pnew;
}
}
//--------------后插法创建单链表 ------------------
void CreateList_E (LinkList &head,int n)
{
int i;
LinkList pnew;
LinkList pend;//定义最后的节点指针;
//先建立头结点,数据为空;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
pend=head;//头结点是最后的节点 ;
for(i=0;i<n;i++)
{
pnew=(LinkList)malloc(sizeof(LNode));
printf("请输入第%d个节点的数据:\n");
scanf("%d",&pnew->data);
pnew->next=NULL;
pend->next=pnew;
pend=pnew;
}
}
//-------------单链表的取值--------------
int GetElem(LinkList head,int i,LNode &elem )
{
int j=1;
LinkList item;
item=head->next;
while(item&&j<i)
{
item=item->next;
j++;
}
if(item==NULL||j>i)//
{
return ERROR;
}
elem.data=item->data;
return OK;
}
//-----------------单链表的查找------------------
LinkList LocateElem(LinkList head,LNode elem)
{
LinkList item;
item=head->next;
while(item!=NULL&&item->data!=elem.data)
{
item=item->next;
}
return item;
}
//------------------插入元素---------------
int ListInsert (LinkList &head,int i,LNode elem)
{
LinkList item,pnew;
int j=0;
item=head;
while(item&&(j<i-1))//查询第i-1个结点,item指向它
{
item=item->next;
++j;
}
if(!item||j>i+1)
return ERROR;
pnew=(LinkList)malloc(sizeof(LNode));
pnew->data=elem.data;
pnew->next=item->next;
item->next=pnew;
return OK;
}
//------------------打印链表----------------
void PrintList(LinkList head)
{
LinkList item;
item=head;
item=item->next;//这一步不是必须要做的,为了跳过头结点(没有数据)
while(item!=NULL)
{
printf("----%d----\n",item->data);
item=item->next;
}
}
//--------------删除元素 -------------------
int DeleteElem(LinkList &head,int i)
{
LinkList item,del;
int j=0;
item=head;
while((item->next)&&(j<i-1))
{
item=item->next;
++j;
}
if(!(item->next)||(j>i-1))
return ERROR;
del=item->next;
//item->next=item->next->next;
item->next=del->next;
delete del;
return OK;
}
int main()
{
LinkList L;
LNode e1,e2;//用来测试的
int n;
int e2_data;
//-------------创建列表测试------------
printf("输入要创建的链表结点个数:\n");
scanf("%d",&n);
printf("输入%d个数据:\n",n);
CreatList_H(L,n);
printf("\n打印出来看看!\n");
PrintList(L);
//-----------取值测试 -----------------
printf("输入要取值的位置:\n");
scanf("%d",&n);
GetElem(L,n,e1);
printf("\n--该位置上取出的的数据是-%d--\n",e1.data);
////------------查找测试------------ ----
printf("请输入要查找的元素的值e2:\n");
scanf("%d",&e2.data);
e2_data=LocateElem(L,e2)->data;
printf("e2该元素上的数据是%d\n",e2_data);
//-------------删除测试---------------
printf("请输入要删除元素的位置:\n");
scanf("%d",&n);
DeleteElem(L,n);
printf("\n删除后的链表如下:\n");
PrintList(L);
//-----------插入测试----------------
printf("输入要插入的位置:\n");
scanf("%d",&n);
ListInsert(L,n,e2);
printf("\n插入后的链表如下:\n");
PrintList(L);
return 0;
}
链表到此完结!
博主水平不高,如有失误处恳望指出