不带表头结点的单向链表基本操作
2019-02-27 15:33
1011 查看
[code] #include <stdio.h> #include <stdlib.h> struct node { int num; struct node *next; }; typedef struct node Node; typedef struct node *Link; void create_head(Link *head) { *head=NULL; }//不带头结点的单向链表,表头初始化为空 void create_node(Link *new_node) { *new_node=(Link)malloc(sizeof(Node)); }//给结点分配空间 void insert_node_head(Link *head,Link new_node) { new_node->next=*head; *head=new_node; }//头插法,各结点插于表头,与带头结点的单向链表操作一致 void insert_node_tail(Link *head,Link new_node) { Link p; p=*head; if(p==NULL) { *head=new_node; new_node->next=NULL; } else { while(p->next!=NULL) { p=p->next; } p->next=new_node; new_node->next=NULL; } }//尾插法,先判断表头是否为空 void insert_node_mid_before(Link *head,Link new_node, int insertlocation) { Link p,q; p=*head; if(p==NULL) { printf("link is empty!\n"); free(new_node); return; } else { while(p!=NULL&p->num!=insertlocation) { q=p; p=p->next; } if(p==NULL) { printf("no location to insert!\n"); return; } else { new_node->next=p; q->next=new_node; } } }//中间插入,在new_node->num=insertloction前面插入 void insert_node_mid_after(Link *head,Link new_node,int insertlocation) { Link p,q; p=q=*head; if(q==NULL) { printf("the link is empty!\n"); } else { while(q!=NULL&&q->num!=insertlocation) { q=p; p=p->next; } if(q==NULL) { printf("no location to insert!\n"); } else { q->next=new_node; new_node->next=p; } } } void delete_node(Link *head,int deletenum) { Link p,q; p=q=*head; if(p==NULL) { printf("the link is empty!\n"); return; } else { while(p->next!=NULL&&p->num!=deletenum) { q=p; p=p->next; } if(p->next==NULL) { printf("no location to delete!\n"); } else { q->next=p->next; free(p); } } } void display(Link head) { Link p=head; if(p==NULL) { printf("the link is empty!\n"); } while(p!=NULL) { printf("num=%d\n",p->num); p=p->next; } }//回显函数 void release(Link *head) { Link p; p=*head; if(*head==NULL) { printf("the link is empty!\n"); } while(*head!=NULL) { *head=(*head)->next; free(p); p=*head; } }//释放包括头结点所有结点 int main() { Link head,new_node; int i; int insertlocation; int deletenum; create_head(&head); for(i=0;i<10;i++) { create_node(&new_node); new_node->num=i+1; //insert_node_head(&head,new_node); insert_node_tail(&head,new_node); } display(head); create_node(&new_node); printf("enter insert numbers:\n"); scanf("%d",&new_node->num); printf("enter insertlocation:\n"); scanf("%d",&insertlocation); insert_node_mid_after(&head,new_node,insertlocation); display(head); printf("enter delete num:\n"); scanf("%d",&deletenum); delete_node(&head,deletenum); display(head); release(&head); display(head); return 0; }
相关文章推荐
- 数据结构——单向链表的基本操作C语言描述(克服对头结点和尾结点的操作)
- 链表(二)——单向链表的基本操作(创建、删除、打印、结点个数统计)
- 数据结构学习笔记(二) 链表之带表头结点的单循环链表基本操作
- 昨天写的带头结点的单向链表基本操作更新,主要是中间插入部分以及释放
- 数据结构学习笔记(二) 链表之带表头结点的双循环链表基本操作
- 带头结点的单向链表的基本操作
- C语言单链表的基本操作(带表头结点)
- C语言实现,无头结点不带环的单向链表的基本操作
- 数据结构学习笔记(二) 链表之带表头结点的单链表及其基本操作
- 单向循环链表的基本操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 算法与数据结构-单向链表的基本操作C语言实现
- java 单向链表的基本操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- java版的单向链表的基本操作
- C语言实现单链表(带头结点)的基本操作
- 单向循环链表的创建及基本操作的实现
- 单向链表的基本操作
- 基本单向链表的操作
- 单向链表的基本操作