mysql增删改查链表_单向链表增删改查的实现

/*实现单向链表的增删改查 */

#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");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值