1,算法描述:在无头单链表中,删除指针p所指向的结点
注意:是没有头结点的。
算法思想:我们无法得到p所指结点的前驱,但是其后继是知道的,当前结点和后继结点的区别是data的不同,我们可以将p所指向结点的后继的值赋给p所指向的结点,将p所指向结点的后继删除,将该后继的后继地址赋给p的next。即
q=p->next;
p->data=q->data;
p->next=q->next;
free(q);
注意这里p所指向的结点不能是最后一个结点,否则直接删除后,其前驱的next域无法置为NULL。
代码如下:
#include "stdafx.h"
#include<stdio.h>
#include <malloc.h>
#define SIZE 100
#define INCREMENT_SIZE 10
typedef struct LNode
{
int data;
LNode *next;
}LNode,*LinkList;
//creat a LinkList
bool creatLinklist(LinkList&L,int n)
{
LinkList p,q,t,s;
L=(LNode*)malloc(n*sizeof(LNode));
if(!L)
return false;
q=L;
for(int i=1;i<=n;i++)
{
p=(LNode*)malloc(sizeof(LNode));
scanf("%d",&p->data);
L->next=p;
L=p;
}
p->next=NULL;
L=q;
return true;
}
//delete a Node in a Linklist without headNode
bool LinkNoHeadlistDelete(LinkList &p)
{
LinkList q;
if(!p)
return false;
q=p->next;
if(q)
{
p->data=q->data ;
p->next=q->next;
free(q);
return true;
}
}
void main()
{
LinkList Llist,p,t;
int k;
int len;
int elemet;
int position;
printf("input the number of LinkList to be created:");
scanf("%d",&k);
creatLinklist(Llist,k);
printf("\n");
t=Llist;
for(int i=0;i<k-4;i++)
t=t->next;// random a Node
LinkNoHeadlistDelete(t);
printf("output the new LinkList:\n");
p=Llist->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
free(Llist);
}
运行结果如下: