单链表C语言

来源:互联网 发布:东方不败 知乎 编辑:程序博客网 时间:2024/05/29 03:15
seqlist.h#ifndef _SEQLIST_H#define _SEQLIST_H#include"ututli.h"#define ElemType int#define DEFAULT_SIZE 8//初始化时数组的长度#define LIST_INCREMENT 2//每次增加的长度typedef struct SeqList{ElemType *base;size_t len;size_t capacity;}SeqList;void InitSeqList(SeqList *list);//初始化函数int isfull(SeqList *list);//判断是否为空void move(SeqList *list,int m,int n);//将制定位置移动函数void push_back(SeqList *list,ElemType x );//后插函数void push_front(SeqList *list,ElemType x);//头插函数void pop_back(SeqList *list);//尾删函数void pop_front(SeqList *list);//头删函数void insert_pos(SeqList *list,int i,ElemType e);//按位置插入void insert_val(SeqList *list,ElemType e);//按值插入void delete_pos(SeqList *list,int i);//按位置删除void delete_val(SeqList *list,ElemType e);//按值删除int  find_val(SeqList *list,ElemType e);//按值查找int  length(SeqList *list);//求顺序表的长度int  isempty(SeqList *list);//判断是否为空,0为假,1为真.void clear(SeqList *list);//清空顺序表void resver(SeqList *list);//转置顺序表void show_list(SeqList *list);//显示函数void sort(SeqList *list);//排序函数void DestroySeqlist(SeqList *list);//摧毁函数bool ListInsert(SeqList *list,int i,ElemType e);//动态插入函数//////////////////////////////void InitSeqList(SeqList *list){list->base = ( ElemType*)malloc(sizeof(SeqList) * DEFAULT_SIZE);assert(list != NULL);list->len = 0;list->capacity = DEFAULT_SIZE;}void sort(SeqList *list)//使用冒泡排序法{if(list->len == 0 || list->len == 1)return;else{int i,j,t;for(i = 0; i <list->len-1; ++i )for(j = 0; j < list->len-1-i; ++j)if(list->base[j] > list->base[j+1]){t = list->base[j];list->base[j] = list->base[j+1];list->base[j+1] = t;}}}//判断是否满,如果为满的话,返回0,不满的话返回1.int  isfull(SeqList *list){if(list->len == list->capacity)return 0;elsereturn 1;}void move(SeqList *list,int m,int n)//m代表位置,n代表前移或者后移.{//为0代表前移,为1代表后移.int k;if(n == 1){for(k = list->len-1; k >= m-1; --k)//将指定的位置向后移动list->base[k+1] = list->base[k];}else{for(k = m; k < list->len; ++k)list->base[k-1] = list->base[k];}}bool ListInsert(SeqList *list,int i,ElemType e){ElemType *newbase,*q,*p;if(i < 1 || i > list->len+1)//插入的位置不合法returnfalse;if(list->len >= list->capacity){if(!(newbase = (ElemType*)realloc(list->base,(list->capacity + LIST_INCREMENT) * sizeof(ElemType))))exit(0);//存储分配失败list->base = newbase;//新地址list->capacity += LIST_INCREMENT;//增加存储容量}q = list->base+i-1;//q为插入位置move(list,i,1);//插入位置的元素向后移动*q = e;//插入++list->len;//表长增加1return true;}void push_back(SeqList *list,ElemType x ){if(isfull(list) == 0){printf("顺序表已满,错误\n");return ;}elselist->base[list->len++] = x;}void push_front(SeqList *list,ElemType x){if(isfull(list) == 0){printf("顺序表已满,错误\n");return;}else{move(list,1,1);list->base[0] = x;}list->len++;}void pop_back(SeqList *list){if(list->len == 0)return;list->len--;}void pop_front(SeqList *list){if(list->len == 0)return;else if(list->len == 1)list->len--;else if(list->len <= list->capacity){move(list,1,0);list->len--;}}void insert_pos(SeqList *list,int i,ElemType e){if(list->len == list->capacity)return;else if(i < 1 || i > list->len+1)return;else if(i <= list->len)move(list,i,1);list->base[i-1] = e;list->len++;}void insert_val(SeqList *list,ElemType e){if(isfull(list) == 0)return;elsepush_back(list,e);}void delete_pos(SeqList *list,int i){if(isfull(list) == 0)return;if(i < 1 || i > list->len)return;if(i < list->len)//如果删除不是最后位置move(list,i,0);list->len--;}void delete_val(SeqList *list,ElemType e){int i;for(i = 0; i < list->len; ++i){if(list->base[i] == e)break;}i++;if(i <= list->len)delete_pos(list,i);elseprintf("未找到要删除的值!");}int find_val(SeqList *list,ElemType e)//返回0代表失败{int i;if(list->len == 0)return 0;else{for(i = 0; i < list->len; ++i)if(list->base[i] == e)break;}i++;if(i <= list->len)return i;elsereturn 0;}int length(SeqList *list){return list->len;}int isempty(SeqList *list){if(list->len == 0)return 1;elsereturn 0;}void clear(SeqList *list){//将List置为空表if(isempty(list) == 1)return ;elselist->len = 0;}void resver(SeqList *list){int i,t;if(list->len == 0 || list->len == 1)return;elsefor(i = 0; i < list->len/2; ++i){t = list->base[i];list->base[i] = list->base[list->len-1-i];list->base[list->len-1-i] = t;}}void show_list(SeqList *list){int i = 0;while(list->len > i ){printf("%d->",list->base[i]);i++;}printf("Over\n");}void DestroySeqlist(SeqList *list){//初识条件:顺序线性表已经存在。操作结果,销毁顺序线性表.free(list->base);list->base = NULL;list->len = 0;list->capacity = 0;}#endif
utili.h#ifndef _UTILI_H#define _UTILI_H#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<stdbool.h>#endif

main.c#include<stdio.h>#include"seqlist.h"int main(){SeqList mylist;InitSeqList(&mylist);ElemType Item,p,v;int select = 1;while(select){printf("***************************************\n");printf("[1]push_back      [2]push_front       *\n");printf("[3]show_list      [0]quit_system      *\n");printf("[4]pop_back       [5]pop_front        *\n");printf("[6]insert_pos     [7]insert_val       *\n");printf("[8]delete_pos     [9]delete_val       *\n");printf("[10]find_val      [11]length      *\n");printf("[12]isfull        [13]isempty         *\n");printf("[14]clear         [15]resever      *\n");printf("[16]sort          [17]ListInsert      *\n");printf("***************************************\n");printf("please input select:>");scanf("%d",&select);switch(select){case 1:   printf("请输入要插入的值(以-1结束):");   while(scanf("%d",&Item),Item != -1)push_back(&mylist,Item);break;case 2:  printf("请输入要插入的值(以-1结束):");  while(scanf("%d",&Item),Item != -1)push_front(&mylist,Item);break;case 3:    show_list(&mylist);break;case 4:pop_back(&mylist);break;case 5:pop_front(&mylist);break;case 6:printf("请输入要插入的位置和值(用空格隔开):");scanf("%d%d",&p,&v);insert_pos(&mylist,p,v);break;case 7:printf("请输入要插入的值:");scanf("%d",&v);insert_val(&mylist,v);break;case 8:printf("请输入要删除的位置:");scanf("%d",&v);delete_pos(&mylist,v);break;case 9:printf("请输入要删除的值:");scanf("%d",&v);delete_val(&mylist,v);break;case 10:printf("请输入要查找的值:");scanf("%d",&v);if(0 == find_val(&mylist,v))printf("要查找的值不存在\n");elseprintf("第%d个元素是要查找的值\n",find_val(&mylist,v));break;case 11:printf("此顺序表的长度是:%d\n",length(&mylist));break;case 12:if(0 == isfull(&mylist))printf("此顺序表满\n");elseprintf("此顺序表未满\n");break;case 13:if(0 == isempty(&mylist))printf("此顺序表不空\n");elseprintf("此顺序表空\n");break;case 14:clear(&mylist);break;case 15:resver(&mylist);break;case 16:sort(&mylist);break;case 17:printf("请输入要插入的位置和值:");scanf("%d%d",&p,&v);ListInsert(&mylist,p,v);default:break;}}DestroySeqlist(&mylist);return 0;}


0 0