【C语言】 链表 单链的建立,节点增加 删除 顺序插入

上一篇的升级版



#include<stdio.h>

#include<stdlib.h>


struct bookdata{
int book;
struct bookdata *next;
}; 


/*
打印链表
*/ 
struct bookdata *Display(struct bookdata *head)
{
struct bookdata *dis = head;
while(dis != NULL)
{
printf("%d\n", dis->book);
dis = dis->next; 

}


/*
删除节点 


从一个链表中删除一个节点 并不是真正从内存中把它抹去 而是把它从链表中分离出来 即改变链表的链表关系 
*/ 
struct bookdata *Deletenode(struct bookdata *head)
{
int de;                                 //搜索要删除的节点  存入de 
struct bookdata *m = head;
struct bookdata *mr = head;

printf("guy please put ur data u want de\n");
scanf("%d", &de);

if(head == NULL)                      //链表为空 
{
printf("nonoooooooooooo");
}

while(m->book != de && m->next != NULL)
{
mr = m;           //前一个数据 
m = m->next;      //要删除的那个数据


if(de == m->book)
{
if(m == head) 
{
// 这一步也可以用这个 head = head->next;
  head = m->next;
}
else 
{
mr->next = m->next;
// 为什么不能用这个呢  m = m->next;
//嗦嘎    是换结构体中的 *next  
//从一个链表中删除一个节点 并不是真正从内存中把它抹去 而是把它从链表中分离出来 即改变链表的链表关系 7 
}
}
if(m->next == NULL) printf("cant find data \n");
return (head);
}


/*
插入    按升序插入数据 
*/


struct bookdata *Insetnodo(struct bookdata *head)
{
struct bookdata *p = NULL;
struct bookdata *pr = head;
struct bookdata *temp = NULL;
p = (struct bookdata *)malloc(sizeof(struct bookdata));
if(p == NULL)
{
printf(" no enough memory\n");
}

printf("please put ur nodo\n");
scanf("%d", &p->book);
p->next = NULL;

if(head == NULL)
{
head = p;
}
else
{
while(pr->book < p->book && pr->next != NULL)
{
temp = pr; //前一个 
pr = pr->next; //后一个 

if(pr->book >= p->book)
{
if(pr == head)
{
p->next = head;
head = p;

else{
pr = temp; //这个必须要  why?
// pr->next = p;
p->next = pr->next;
pr->next = p; //理解 为 :中间亮p,分别被上一个节点所指并指向下一个节点   满足插入
}

else
{
pr->next = p;
}

}

return head;



int main()
{
int de;
char key;
struct bookdata *head = NULL;
struct bookdata *last = NULL;
struct bookdata *p = NULL;






printf("do u want to write ?\n");
key = getchar();
while(key == 'y')
{
p = (struct bookdata *)malloc(sizeof(struct bookdata));
if(p == NULL)
{
printf("sorry no enough memry \n");
}
printf("write ur data\n");
scanf("%d", &p->book);
if(head == NULL)
{
head = p;
last = p;
}
else
{
last ->next = p;
last = p;
}
p ->next = NULL;
printf("again?\n");
scanf(" %c", &key);
}


printf("******************\n");
Display(head);




head = Deletenode(head);            //这一步困了好久啊
// 刚开始是直接  Deletenode(head);  
// 实际返回的head 根本没有变化哈 





printf("******************\n");
Display(head);
head = Insetnodo(head);
printf("******************\n");
Display(head);

return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值