单链表(不带头结点)
插入
1.在第一个结点前插入
newnode->link=first;
first=newnode;
2.在链表中间插入
newnode->link=p->link;
p->link=newnode;
3.在链表末尾插入
newnode->link=p->link;
p->link=newnode;
插入元素代码如下:
bool insert(linklist&first,datatype x,int i)
{
linknode *newnode;
newnode=(linknode*)malloc(sizeof(linknode));
newnode->data=x;
if(first==NUll||i==1)
{
newnode->link=first;
first=newnode;
}
else
{
linknode *p=first,*pr;
int k=1;
while(p!=NULL&&k<i-1)
{
pr=p;
p=p->link;
k++;
}//寻找第i-1个结点
if(p==NULL&&first!=NULL)
p=pr;//链太短,插在链尾
newnode->link=p->link;
p->link=newnode;
}
return true;
}
删除
1.删除表中第一个元素
2.删除表中或表尾元素
代码如下:
bool remove(linknode&first,int i,datatype&x)
{
//删除第i个结点并返回值
int k;
linknode *p,*q;
if(i==0)
return false;
if(i==1)
{
q=first;
first=first->link;
}
else
{
p=first;
int k=1;
while(p!=NULL&&k<i-1)
{
p=p->link;
k++
}
if(p==NULL||p->link==NULL)
{
printf("链太短,无可删除结点");
return false;
}
else{
q=p->link;
p->link=q->link;
}
x=q->data;
free(q);
return true;
}
}
单链表(带头结点)
头结点位于表的最前端,本身不带数据,仅仅标志表头。
设置头结点的目的是统一空表与非空表的操作,简化链表操作的实现。
插入
1.前插法建立单链表
从一个空表开始,重复读入数据:
生成新节点,将读入数据存放到新节点的数据域中,将该新节点插入到链表的前端。直到读入结束符为止。
代码如下:
void insertfront(linklist&first,datatype endtag)
{
datatype val;
linknode *s;
scanf("%d",&val) //读入数据
while(val!=engtag)
{
s=(linknode *)malloc(sizeof(linknode));
s->data=val;
s->link=first->link;
first->link=s;
scanf("%d",&val);
}
}
2.后插法建立单链表
每次将新结点加插到链表的链尾;
设置一个尾指针r,总是指向最后一个结点,新结点插到他后面,尾指针初始时指向表头结点位置。
代码如下:
void insertrear(linklist&first,datatype endtag)
{
datatype val;
linknode *s,*rear=first;
scanf("%d",&val) //读入数据
while(val!=engtag)
{
s=(linknode *)malloc(sizeof(linknode));
s->data=val;
rear->link=s;
rear=s;
scanf("%d",&val);
}
rear->link=NULL;
}
查找
按值查找
linknode *search(linklist first,datatype x)
{
linknode *p=first->link;
while(p!=NULL&&p->data!=x)
{
p=p->link;
}
return p;
}
上面代码中while循环条件p!=NULL与p->data!=x不能错位,否则当p=NULL时,p->data会发生错误。
按序号查找
linknode *locate(linklist first,int i)
{
if(i<0) return NULL;
linknode *p=first;
int k=0
while(p!=NULL&&k<i)
{
p=p->link;
k++;
}
return p;
}