双链表的实现以及插入删除等操作
2017-05-19 18:33
417 查看
//...........DList.h #ifndef _LIST_H_ #define _LIST_H_ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<assert.h> #define ElemType int typedef struct Node { ElemType data; struct Node *prio; struct Node *next; }Node,*PNode; typedef struct List { PNode first; PNode last; int size; }List; void InitList(List *list); Node* buynode(ElemType x); void show_list(List *list); void push_back(List *list, ElemType x); void push_front(List *list, ElemType x); void pop_back(List *list); void pop_front(List *list); void insert_val(List *list, ElemType x); Node* find(List *list, ElemType x); int length(List *list); void delete_val(List *list, ElemType x); void sort(List *list); void reverse(List *list); void clear(List *list); void destory(List *list); void quit_system(List *list,int *x); #endif //.......DList,cpp #include "DList.h" void InitList(List *list) { Node *s=(Node *)malloc(sizeof(Node));//申请头结点 assert(s!=NULL); list->first =list->last =s; list->last ->next =NULL; list->first->prio =NULL; list->size =0; } Node* buynode(ElemType x) //购买节点 { Node *s=(Node*)malloc(sizeof(Node)); assert(s!=NULL); s->data=x; s->next =s->prio =NULL; return s; } void push_back(List *list, ElemType x) { Node *s=buynode(x); s->prio=list->last ; list->last ->next =s; list->last =s; list->size ++; } void push_front(List *list, ElemType x) { Node *s=buynode(x); //判断添加的结点是否是第一个节点 if(list->first ==list->last ) { list->last =s; } else { s->next =list->first ->next ; s->next ->prio =s; } s->prio =list->first ; list->first ->next =s; list->size ++; } void pop_back(List *list) { if(list->size ==0) return ; Node *p=list->first ; while(p->next !=list->last ) p=p->next; free(list->last ); list->last =p; list->last ->next =NULL; list->size --; } void pop_front(List *list) { if(list->size ==0) return ; Node *p=list->first->next ; if(list->first ->next ==list->last) //只有一个结点 { list->last =list->first ; list->last ->next =NULL; } else { p->next ->prio =list->first ; list->first ->next =p->next ; } free(p); } void insert_val(List *list, ElemType x) { Node *p=list->first ; while(p->next !=NULL&&p->next ->data <x) p=p->next ; if(p->next ==NULL) { push_back(list,x); } else { Node *s=buynode(x); s->next =p->next ; s->next ->prio =s; s->prio =p; p->next =s; list->size ++; } } void delete_val(List *list, ElemType x) { if(list->size ==0) return ; Node *p=find(list,x); if(p==NULL) { printf("要删除的值不存在.\n"); return ; } if(p==list->last ) //删除最后一个节点 { list->last =p->prio ; list->last ->next =NULL; } else { p->next ->prio =p->prio; p->prio ->next =p->next ; } free(p); list->size--; } Node* find(List *list, ElemType x) { Node *p=list->first ->next ; while(p!=NULL&&p->data !=x) //不可交换顺序 若p为空则不会有data域 p=p->next ; return p; } int length(List *list) { return list->size; } void sort(List *list) { if(list->size ==0||list->size ==1) return ; Node *s=list->first ->next ; Node *q=s->next ; list->last =s; list->last ->next =NULL; while(q!=NULL) { s=q; q=q->next ; Node *p=list->first ; while(p->next !=NULL&&p->next ->data <s->data ) p=p->next; if(p->next ==NULL) { s->next =NULL; s->prio =list->last ; list->last ->next =s; list->last =s; } else { s->next =p->next ; s->next ->prio =s; s->prio =p; p->next =s; } } } void reverse(List *list) { if(list->size ==0||list->size ==1) return ; Node *p=list->first ->next ; Node *q=p->next ; list->last =p; list->last ->next =NULL; while(q!=NULL) { p=q;; q=q->next ; p->next =list->first ->next ; p->next ->prio =p; p->prio =list->first ; list->first ->next =p; } } void clear(List *list) { if(list->size ==0) return ; Node *p=list->first->next ; while(p!=NULL) { if(p==list->last ) { list->last =list->first ; list->last ->next =NULL; } else { p->next->prio =list->first ; list->first ->next =p->next ; } free(p); p=list->first ->next ; } list->size =0; } void destory(List *list) { clear(list); free(list->first ); list->first =list->last =NULL; } void quit_system(List *list,int *x) { *x=0; } void show_list(List *list) { Node *p=list->first ->next ; while(p!=NULL) { printf("%d-->",p->data ); p=p->next; } printf("null.\n"); } //.............main.cpp #include"DList.h" int main( c181 ) { List mylist; InitList(&mylist); ElemType Item; Node *p=NULL; int select=1; Node* pos; while(select) { printf("*********************************\n"); printf("[0] quit_system [1] show_list *\n"); printf("[2] push_front [3] push_back *\n"); printf("[4] pop_front [5] pop_back *\n"); printf("[6] insert_val [7] delete_val *\n"); printf("[8] find_val [9] length *\n"); printf("[10] clear [11] destory *\n"); printf("[12] reverse [13] sort *\n"); printf("*********************************\n"); printf("please input select:>"); scanf("%d",&select); switch(select) { case 0: quit_system(&mylist,&select); case 1: show_list(&mylist); break; case 2: printf("please input data:"); while(scanf("%d",&Item),Item!=-1) { push_front(&mylist,Item); } break; case 3: printf("please input data:"); while(scanf("%d",&Item),Item!=-1) { push_back(&mylist,Item); } break; case 4: pop_front(&mylist); break; case 5: pop_back(&mylist); break; case 6: printf("please input the insert val:"); scanf("%d",&Item); insert_val(&mylist,Item); break; case 7: printf("please input the delete data:"); scanf("%d",&Item); delete_val(&mylist,Item); break; case 8: printf("please input the find data:"); scanf("%d",&Item); pos=find(&mylist,Item); if(pos== NULL) { printf("can't find this data."); } break; case 9: printf("the list's length is:%d",length(&mylist)); printf("\n"); break; case 10: clear(&mylist); break; case 11: destory(&mylist); break; case 12: reverse(&mylist); break; case 13: sort(&mylist); break; default: break; } system("pause"); system("cls "); } return 0; }
相关文章推荐
- 对线性表理解以及C语言实现链表的插入删除等操作。
- 设计一个整型链表类list,能够实现链表节点的插入、删除、以及链表数据的输出操作。
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- C语言实现链表插入,删除相关操作
- 单向链表操作(产生,删除,插入以及查询)
- 顺序表,链表,静态链表的建立以及插入和删除操作
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- (C++版)链表(二)——实现单项循环链表创建、插入、删除等操作
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- (C++版)链表(一)——实现单向链表创建、插入、删除等相关操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表