单向链表增删改查的实现
/*实现单向链表的增删改查 */
#include
#include
#include
#define LEN sizeof(node)
typedef struct node
{
int num;
struct node *next;
}node,*pnode;
/*在链表头进行插入,新节点成为头节点,原头节点成为新节点的下一个节点,头节点指针后伊一位*/
void insert_head(pnode *phead,int data)
{
pnode p;
p=(pnode)malloc(sizeof(LEN));
if(NULL==p)
{
perror("malloc fail");
exit(1);
}
p->num=data;
p->next=(*phead);
(*phead)=p;
}
/*在链表尾进行插入*/
void insert_tail(pnode *phead,int data)
{
pnode p;
// 插入的新结点
pnode p2=(*phead);
//链表中的指针初始化,否则会发生段错误
p=(pnode)malloc(sizeof(LEN));
if(NULL==p)
{
perror("malloc fail");
exit(1);
}
p->next=NULL;
p->num=data;
if(*phead)
{
while(p2->next) //遍历链表,找到鏈表末尾节点
{
p2=p2->next;
}
p2->next=p;
}
}
【单向链表增删改查的实现】
/*在链表头进行删除*/
void delate_head(pnode *phead)
{
if((*phead)==NULL)
{
return 0;
}else{
pnode p;
p=(*phead);
//找到链表头节点,保存后释放,同时头节点指针后移一位
(*phead)=(*phead)->next;
free(p);
}
}
/*在链表尾进行删除*/
void delate_tail(pnode *phead)
{
pnode p;
pnode p1;
p=(*phead);
if(*phead)
{
while((p->next)!=NULL)
{
p1=p;
//p1用来保存原来p的位置,所以应该先保存,再后移
p=p->next;
}
if(p1) //p1始终指向倒数第二个节点,但链表只有一个结点时,p1不存在,所以需要进行判断
{
free(p);
p1->next=NULL;
}else{
free(p);
}
}
}
/*根据num来匹配想要想要寻找的节点*/
struct node *find_data(pnode phead,int data)
{
pnode p;
p=phead;
while(p!=NULL && (p->num) !=data) //遍历链表
{
p=p->next;
}
if(p){ // 判断查找数据是否存在
printf(" 您想查找的數據是:%d\n",p->num);
}else{
printf("你所查找的数据不存在\n");
}
return p;
}
/*根据data来删除节点,要删除节点为p->next,要删除节点的上一节点为p,要删除节点的下一节点为q*/
void delate_data( pnode *phead,int data)
{
pnode p,q;
p=(*phead);
if((*phead)->num==data)
{
delate_head(phead);
}else{
while((p->next)!=NULL &&(( p->next)->num) !=data) //定位到要删除节点的上一节点
{
p=p->next;
}
if((p->next)==NULL){
printf("你所删除的数据不存在\n");
}else{
q=p->next->next;
free(p->next);
p->next=q;
}
}
}
/*根据节点序列号来修改链表中的数据 */
void modify_data(pnode *phead,int x,int y) //参数分别为头节点指针,修改的节点序,修改后的数据
{
int i=0;
pnode p=(*phead);
while(p){
if(i==x)
{
p->num=y;
break;
}
p=p->next;
i++;
}
if(i
printf(" 你所输入的序列号不合法\n ");
return 0;
}
}
void printf_list(pnode head)
{
while(head)
{
printf("%d\n",head->num);
head=head->next;
}
printf("\n");
}
void main(void)
{
struct node *head=NULL;
insert_head(&head,1);
//测试前插
insert_head(&head,2);
insert_head(&head,3);
insert_head(&head,4);
insert_head(&head,5);
printf("前插成功\n");
insert_tail(&head,6);
//测试后插
insert_tail(&head,7);
insert_tail(&head,8);
insert_tail(&head,9);
printf("后插成功\n");
delate_head(&head);
printf("前删成功\n");
delate_tail(&head);
delate_tail(&head);
printf("后删成功\n");
find_data(head,2);
printf("查找数据成功\n");
find_data(head,10);
// 查找的数据不存在
delate_data(&head,2);
printf("删除指定数据成功\n");
delate_data(&head,10);
//删除的数据不存在
modify_data(&head,2,15);
//测试修改
modify_data(&head,6,15);
//测试修改
printf_list(head);
//测试打印
printf("遍历成功\n");
}
转载于:https://www.cnblogs.com/wdl2016/p/5782802.html
推荐阅读
- 增长黑客的海盗法则
- leetcode|leetcode 92. 反转链表 II
- Excel|Excel 2013 新增功能之瞬间填充整列数据!
- 木村拓哉透露“增高术”,16岁女儿身高1米7,每天都坚持一件事
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript之DOM增删改查(重点)
- 窝在家里,你闷坏了吗(了解这12个假设,给自己的心理增加免疫力)
- MX19022-王阿呆-第4节课作业(做市场行情精准判定与竞品分析#萌新运营苑裂变增长操盘手#)
- 应为自己增值
- 12.新增腾讯的统计(以渠道来源说明)