数据结构 单链表删除结点 例子
2017-09-11 22:30
381 查看
单链表的删除是将下一个节点移到待删除的节点上,只需移动这两个位置,其他的位置不用变化,这也是链表的优点。而数组的删除则是将待删除数值之后的所有数据移动一遍。
下面的程序是按照位置对链表的数值进行删除。
#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
下面的程序是按照位置对链表的数值进行删除。
#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
相关文章推荐
- 【数据结构】单链表—在O(1)时间删除链表结点
- 【数据结构】单链表的倒序、删除相同结点、按值排序等简单操作用java实现
- 结构之美:删除单链表指定位置的数据
- 数据结构——算法之(027)( 在O(1)时间内删除链表结点)
- 【数据结构】单链表的插入与删除
- 数据结构(三)——单链表的插入与删除
- 【数据结构】单链表的建立,测长,打印,删除,插入, 排序, 逆置
- 【数据结构作业二】写出单链表结点的结构体类型定义及查找、插入、删除算法,并以单链表作存储结构,实现有序表的合并
- 【数据结构】单链表—链表中倒数第K个结点 — 快慢指针
- 成人版java数据结构之单链表II删除
- 数据结构—二叉搜索树的创建、结点的插入和删除
- 程序员面试宝典之数据结构基础----②单链表删除节点(读后)
- 数据结构——链表之单链表重复元素的删除
- 数据结构:程序加图示分析单链表的插入和删除操作
- 数据结构——算法之(027)( 在O(1)时间内删除链表结点)
- 数据结构之单链表删除第i个元素并用e返回其值的算法
- 数据结构:头插法、尾插法创建单链表,求链表长度、查找、插入、删除、合并
- 删去单链表中第i个节点的操作。删除单链表中数据域为x的前驱元素。数据结构。
- 数据结构-单链表的读取,插入与删除
- 数据结构之单链表的删除