单链表的删除是将下一个节点移到待删除的节点上,只需移动这两个位置,其他的位置不用变化,这也是链表的优点。而数组的删除则是将待删除数值之后的所有数据移动一遍。
下面的程序是按照位置对链表的数值进行删除。
#include <stdio.h>
#include <malloc.h>
#include <time.h>
typedef struct list
{
int vaule; //数据域
struct list *PNext; //指针域
}TNODE, *TPNODE;
TPNODE Creat_list();
void Trave_list(TPNODE _PHead);
int Delete_List(TPNODE _pHead, int _pos, int *_iVal);
int main()
{
int iVal = 0;
int pos = 0;
TPNODE PHead;
srand((int)time(NULL));
PHead = Creat_list(); //创建链表
Trave_list(PHead); //遍历链表
printf("please input delete pos\n"); //想删除第几个数值
scanf("%d", &pos);
if(1 == Delete_List(PHead, pos, &iVal))//删除链表
{
printf("Delete fail\n");
}
else
{
Trave_list(PHead); //遍历链表
printf("%d had Delete\n", iVal); //输出刚才被删除的数值
}
return 0;
}
//创建链表
TPNODE Creat_list()
{
int i = 0;
int len = 0;
int iVaule = 0;
TPNODE pHead;
pHead = (TPNODE)malloc(sizeof(TNODE)); //创建一个头结点
if(NULL == pHead) //创建失败
{
printf("create list fail\n");
}
TPNODE PTail = pHead;
pHead->PNext = NULL;
printf("please input len of list\n");
scanf("%d", &len); //输入想要的个数
for(i = 0; i < len; i++)
{
iVaule = rand()%100+1;
TPNODE pNew = (TPNODE)malloc(sizeof(TNODE)); //分配内存
pNew->vaule = iVaule; //将数据域赋予数据
PTail->PNext = pNew;
pNew->PNext = NULL;
PTail = pNew;
}
return pHead;
}
//链表输出
void Trave_list(TPNODE _PHead)
{
int i = 0;
TPNODE P = _PHead->PNext;
while(NULL != P)
{
i = 1;
printf("%d ", P->vaule);
P = P->PNext;
}
if(1 == i)
{
printf("\n");
}
}
//链表删除
int Delete_List(TPNODE _pHead, int _pos, int *_iVal)
{
int i = 0;
TPNODE p = _pHead;
while(NULL != p->PNext && i < _pos-1)
{
p = p->PNext;
//printf("val: %d\n", p->vaule);
i++;
}
if(i > _pos -1 || NULL == p->PNext)
{
return 1;
}
TPNODE q = p->PNext;
*_iVal = p->PNext->vaule;
p->PNext = p->PNext->PNext; //将待删除节点后面的一个节点放到待删除节点的位置
free(q);
q = NULL;
return 0;
}
此程序的运行结果:
创建链表:http://blog.csdn.net/z_dream_st/article/details/77142223
链表的插入:http://blog.csdn.net/z_dream_st/article/details/77726255