上一篇的升级版
#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;
}