#include "myhead.h"
//定义结构体表示单链表
struct siglelist
{
int data;
struct siglelist *next;
};
//封装链表的初始化
struct siglelist *list_init()
{
struct siglelist *myhead=malloc(sizeof(struct siglelist));
myhead->next=NULL;
return myhead;
}
//尾部插入
int insert_tail(int newdata,struct siglelist *head)
{
//找到链表的尾部
struct siglelist *p=head;
while(p->next!=NULL)
p=p->next; //把赋值= 翻译成指向
//准备好新的节点
struct siglelist *newnode=malloc(sizeof(struct siglelist));
newnode->data=newdata;
newnode->next=NULL;
//p的下一个节点指向newnode
p->next=newnode;
}
//中间插入,把newdata插入到olddata的后面
int insert_mid(int newdata,int olddata,struct siglelist *head)
{
//找到olddata所在的节点
struct siglelist *p=head;
while(p->next!=NULL)
{
p=p->next;
if(p->data==olddata)
break;
}
//准备新节点
struct siglelist *newnode=malloc(sizeof(struct siglelist));
newnode->data=newdata;
newnode->next=NULL;
newnode->next=p->next;
p->next=newnode;
}
//单链表的删除,用两个指针解决
int remove_list(int deldata,struct siglelist *head)
{
int flag=0; //标记是否找到要删除的数据
//找到要删除的节点
struct siglelist *q=head;
struct siglelist *p=head->next;
while(p->next!=NULL)
{
if(p->data==deldata)
{
flag=1;
q->next=p->next;
p->next=NULL;
free(p);
p=q->next;
}
else
{
p=p->next;
q=q->next;
}
}
//经过仔细分析,发现前面的循环漏掉了最后一个数据没有判断,没有删除
if(p->next==NULL && p->data==deldata)
{
//把最后一个数据删除即可
q->next=NULL;
free(p);
p=NULL;
return 0;
}
if(flag==0 && p->next==NULL && p->data!=deldata)
{
printf("没有你要删除的数据!\n");
return -1;
}
}
//打印链表
int show_list(struct siglelist *head)
{
struct siglelist *p=head;
while(p->next!=NULL)
{
p=p->next;
printf("当前遍历的节点中存放的数据是:%d\n",p->data);
}
}
int main()
{
int m,n;
int i;
//准备头节点
struct siglelist *mylist=list_init();
//尾插一部分数据
for(i=0; i<4; i++)
{
printf("输入尾插数据!\n");
scanf("%d",&m);
insert_tail(m,mylist);
}
//打印
printf("=====尾部插入========\n");
show_list(mylist);
//删除数据
printf("请输入你要删除的数据!\n");
scanf("%d",&n);
remove_list(n,mylist);
printf("=====删除完毕========\n");
show_list(mylist);
}
单链表实现增删改查
最新推荐文章于 2024-05-01 15:44:50 发布