单循环链表的创建、插入删除等操作
来源:互联网 发布:西南大学远程网络培训 编辑:程序博客网 时间:2024/05/23 23:13
//..... SClist.h#ifndef _SCLIST_H_#define _SCLIST_H#include<stdio.h>#include<malloc.h>#include<assert.h>#include<stdlib.h>#define ElemType inttypedef struct Node{ElemType data;struct Node *next;}Node,*PNode;typedef struct List{PNode first;PNode last; int size;}List;Node * buynode(ElemType x);void InitSCList(List *list);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); void quit_system(List *list,int *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); #endif//...............SClist.cpp#include"SCList.h"void InitSCList(List *list){Node *s=(Node*)malloc(sizeof(Node));assert(s!=NULL);list->first=list->last=s;list->last ->next=list->first ;list->size=0;}Node* buynode(ElemType x){Node *s=(Node*)malloc(sizeof(Node));assert(s!=NULL);s->data =x;s->next=NULL;return s;}void push_back(List *list, ElemType x){Node *s=buynode(x);list->last->next =s;list->last=s;list->last ->next =list->first ;list->size ++;}void push_front(List *list, ElemType x){Node *s=buynode(x);s->next=list->first ->next ;list->first ->next =s;if(list->first ==list->last )//插入的结点是第一个节点{ list->last=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 =list->first ;list->size--;}void pop_front(List *list){if(list->size ==0)return ;Node *p=list->first ->next;list->first->next =p->next ;free(p);if(list->size ==1) //删除的是最后一个结点{list->last=list->first;}list->size--;}void insert_val(List *list, ElemType x){Node *p=list->first ;while(p->next!=list->last && p->next ->data <x){p=p->next ;}if(p->next ==list->last && p->next->data <x){push_back(list,x);}else{ Node *s=buynode(x);s->next=p->next;p->next =s;list->size++;}}Node* find(List *list, ElemType x){if(list->size==0)return NULL;Node *p=list->first->next ;while(p!=list->first&&p->data!=x)p=p->next ;if(p==list->first ) //找了一圈还没找到return NULL;return p;}int length(List *list){return 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 ) //找到的是最后一个节点{pop_back(list);}else{Node *q=p->next;p->data =q->data ; //覆盖p->next =q->next;free(q);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 ->next =NULL; //不循环list->last=s;list->last->next=list->first ; //链表后面断开while(q!=NULL){s=q;q=q->next;Node *p=list->first ;while(p->next !=list->last &&p->next ->data <s->data){p=p->next;}if(p->next==list->last &&p->next->data <s->data){s->next =list->last ->next ;list->last ->next =s;list->last =s;}else{s->next =p->next ;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->next =NULL;list->last =p;list->last ->next =list->first ; while(q!=NULL){p=q;q=q->next;p->next =list->first ->next ;list->first ->next =p;}}void clear(List *list){Node *p=list->first ->next ;while(p!=list->first ){list->first ->next=p->next ;free(p);p=list->first ->next ;}list->last =list->first ;list->last ->next =list->first ;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!=list->first ) //不为头,则链表未结束 { printf("%d-->",p->data); p=p->next; } printf("null.\n");}//......List.cpp#include"SCList.h"int main(){List mylist;InitSCList(&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;}
阅读全文
0 0
- 单循环链表的创建、插入删除等操作
- 单循环链表-创建、插入、删除、反转等操作
- 双循环链表的创建以及插入删除等操作
- 链表的创建、插入、删除等操作
- 单循环链表的初始化、插入、删除、遍历、查找
- 单链表的创建、插入、删除等操作
- 单链表的创建,插入删除等操作
- 单链表的创建、插入删除等操作
- 顺序表的创建、遍历、插入、删除等操作demo
- 链表操作:创建,插入,删除,查找等功能
- 链表创建、查询、删除、插入等操作
- 链表的创建、插入、删除操作
- 链表的创建、插入、删除操作
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- c++之链表篇1:单向链表的创建,打印,删除,插入,销毁等基本操作
- 数据结构:链表创建、显示、求和、插入、删除等操作的代码实现
- 二叉排序树的创建(结点的插入,删除等操作)
- 单链表的创建、插入,删除、查找等操作
- codeforces——466A——Cheap Travel
- javax.mail发送邮件
- 第十三周
- SecCore关键数据结构
- HTML界面应用标签
- 单循环链表的创建、插入删除等操作
- Unity 与 NGUI 坐标转换原理
- POJ 3087 Shuffle'm Up 模拟
- php错误级别设置
- JAVA——网络编程(3):Java编写在TCP网络连接上传递对象
- lintcode(575)Expression Expand
- Libxml2交叉编译
- Linux 开发过程中I/O操作的效率测试
- LBP(局部二值模式)特征提取原理