带头结点的单向链表的基本操作
2019-02-27 15:43
113 查看
[code] #include <stdio.h> #include <stdlib.h> struct node { int num; struct node * next; }; typedef struct node Node; typedef struct node * Link; void create_node(Link * new_node) { *new_node=(Link)malloc(sizeof(Node)); } void create_head(Link *head) { *head=(Link)malloc(sizeof(Node)); (*head)->next=NULL; }//带头结点的单向链表初始化 void insert_node_head(Link head,Link new_node) { Link p=head; new_node->next=p->next; p->next=new_node; }//头插法 void insert_node_tail(Link head,Link new_node) { Link p = head; while(p->next != NULL) { p=p->next; } if(p->next == NULL) { p->next=new_node; new_node->next=NULL; } }//尾插法,插在最后结点后面,与无头结点的单向链表相比,不用判断首结点是否为空 void insert_node_mid_before(Link head,Link new_node,int insertlocation) { Link p=head; if(p==NULL) { printf("the link is empty!\n"); } else { while(p->next!=NULL &&p->next->num!=insertlocation) { p=p->next; } if(p->next==NULL) { printf("no place no insert!\n"); } else { new_node->next=p->next; p->next=new_node; } } } void insert_node_mid_after(Link head,Link new_node,int insertlocation) { Link p=head; if(p==NULL) { printf("the link is empty!\n"); } else { while(p->next != NULL && p->num != insertlocation) { p=p->next; } if(p->next==NULL) { printf("no place to insert!\n"); } else { new_node->next=p->next; p->next=new_node; } } } void delete_node(Link head,int deletenum) { Link p,q; p=head; if(p==NULL) { printf("the link is empty!\n"); } else { while(p->next!=NULL&&p->next->num!=deletenum) { q=p; p=p->next; } if(p->next==NULL) { printf("no num to delete!\n"); } else { q=p->next; p->next=p->next->next; free(q); } } } 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=*head; if(p==NULL) { printf("the link is empty!\n"); } while(p!=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); insert_node_mid_before(head,new_node,insertlocation); display(head); printf("enter deletenum:\n"); scanf("%d",&deletenum); delete_node(head,deletenum); display(head); return 0; }
相关文章推荐
- 昨天写的带头结点的单向链表基本操作更新,主要是中间插入部分以及释放
- 带头结点的单链表的12个基本操作
- 带头结点的单链表的八种基本操作
- 带头结点的单链表的12个基本操作
- 带头结点的链表基本操作
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 带头结点的单链表的12个基本操作(C++)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 数据结构——单向链表的基本操作C语言描述(克服对头结点和尾结点的操作)
- 数据结构-带头结点带环的双向链表基本操作
- bo2-8.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(9个)
- 不带头结点的单链表的基本操作
- 《数据结构》进行曲--带头结点的单循环链表的基本操作
- bo2-9.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(2个)
- 带头结点的单链表的基本操作
- C语言实现单链表(带头结点)的基本操作
- 链表(二)——单向链表的基本操作(创建、删除、打印、结点个数统计)
- 不带头结点的单链表的基本操作
- 带头结点的循环链表基本操作
- C语言实现双向非循环链表(带头结点尾结点)的基本操作