/*实现单向链表的增删改查 */
#include <malloc.h>
#include <stdio.h>
#include<stdlib.h>
#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<x)
{
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");
}