您的位置:首页 > 其它

*单链表[带头结点]

2016-03-15 20:05 246 查看
基本结构

创建

插入与删除

遍历

销毁





基本结构:


typedef struct node
{
int data;
struct node *next;
}*List,Node;


创建

第一种:先初始化,再创建链表。在初始中,让头结点的next为NULL;

void Init(List &L)
{
L=(List)malloc(sizeof(Node));
if(!L)
exit(-1);
L->next=NULL;
}


第二种:不初始化,直接创建,又分为以下几种。
<1>尾插法,假如创建n个结点。(从前往后建立结点,推荐!

void creat(List &L,int n) /*尾插法*/
{
int e,i;
List p,s;
L=(List)malloc(sizeof(Node));
p=L;
for(i=0;i<n;i++)
{
s=(List)malloc(sizeof(Node));
cin>>e;
s->data=e;

p->next=s;
p=s;
}
p->next=NULL; /*尾部指向空*/
}


<2>头插法:不需要额外的指针、

void creat(List &L,int n)/*头插法*/
{
int e,i;
List s;
L=(List)malloc(sizeof(Node));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(List)malloc(sizeof(Node));
cin>>e;
s->data=e;

s->next=L->next;
L->next=s;
}
}


插入和删除
插入:在第i个位置处插入数据,游标p移到第i-1个位置(也即待删元素左边),这个位置是关键!

int Insert(List &L,int i,int e) /*插入操作*/
/* 1<=i<=L->Length */
{
int j=1;
List p,s;
p=L;/*指向第一个结点*/
while(p && j<i) /*移到i-1的位置处*/
{
p=p->next;
++j;
}
if(!p || j>i) /*防止输入0或者大于结点的长度*/
return ERROR;

s=(List)malloc(sizeof(Node));
s->data=e;

s->next=p->next;
p->next=s;
return OK;
}


删除:借助两个游标p,q,移动之后,q指向第i-1个位置(也就是待删元素左边的位置),p指向待删元素,(这两个位置很重要!)


int Delete(List &L,int i,int &e)
/* 1<=i<=L->Length */
{
int j=1;
List p,q;
q=L;
while(q->next && j<i)/*防止删除长度越界*/
{
q=q->next;
++j;
}
if(!(q->next) || j>i)
return ERROR;

p=q->next;
e=p->data;

q->next=p->next;
free(p);
return OK;
}


遍历

void Traverse(List &L)
{
List p=L->next;
while(p)
{
cout<<p->data;
p=p->next;
}
}


销毁

依然是位置,q指向待销毁元素,p指向待销毁元素的下一个元素,即(p总提前于q)!

int Delete(List &L)
{
List p,q;
q=L->next;
while(q)
{
p=q->next;
free(q);
q=p;
}
L->next=NULL;
return OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: