亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

利用C語言實現順序表的實例操作

2020-01-26 14:28:06
字體:
來源:轉載
供稿:網友

本文實例講述了C語言實現順序表(線性表)的方法。分享給大家供大家參考,具體如下:

一:順序表代碼實現

#ifndef _SEQ_LIST_H#define _SEQ_LIST_H#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#define ElemType float  //以float類型測試算法通用性,而不是以慣用的int#define INIT_SIZE 10  //順序表默認初始化大小#define LIST_INCREMENT 5  //順序表容量增量,容量不夠使用malloc申請#define list_full(list) ((list)->size >= (list)->capacity ? 1 : 0) //順序表判滿#define list_empty(list) ((list)->size == 0 ? 1 : 0)   //判空typedef ElemType value_type;   //元素類型typedef value_type* value_ptr;   //元素指針類型typedef enum {false, true}bool;   //為C語言增加bool量typedef enum {POSITION, VALUE}DELETE_MODE; //刪除元素模式選擇,分別為按位置刪除和按值刪除typedef struct sequelize_list{ ElemType *base;   //順序表基址 int size;   //順序表元素大小 int capacity;   //順序表容量} seq_list, *list_ptr;void init_list(list_ptr lp)  //初始化{ assert(lp != NULL); lp->base = (value_ptr)malloc(sizeof(value_type)*INIT_SIZE); //free assert(lp->base != NULL); memset(lp->base, 0, sizeof(value_type)*INIT_SIZE); lp->size = 0; lp->capacity = INIT_SIZE;}bool insert_elem(list_ptr lp, const int pos, const value_type elem)  //插入元素{ assert(lp != NULL && pos >= 1 && pos <= lp->size+1); if(list_full(lp)){   //如果表滿,追加申請空間 value_ptr new_base = (value_ptr)realloc(lp->base,  sizeof(value_type)*(lp->capacity+LIST_INCREMENT));//此處注意realloc用法,用新地址接收是為了防止realloc失敗,原地址有效內容被釋放 assert(new_base != NULL); //并且realloc填寫的申請空間大小必須是之前的大小+增量的大小,而不是只寫增量,否則如果原地址內存不夠,在新地址申請增量大小的空間,將之前的內容挪至新空間,內存溢出,將發生段錯誤  lp->base = new_base;  //再賦回給原地址 lp->base[lp->capacity] = elem; lp->capacity += LIST_INCREMENT; ++lp->size; } else{    //未滿,插入元素 for(int i=lp->size-1; i>=pos-1; --i){  //將元素后移,騰出位置 lp->base[i+1] = lp->base[i]; }  lp->base[pos-1] = elem;   //插入元素 ++lp->size; //} return true;}bool remove_elem_pos(list_ptr *lp, const int pos) //按位置刪除{ assert(pos >= 1 && pos <= (*lp)->size);    for(value_ptr ptmp=&(*lp)->base[pos-1]; ptmp<&(*lp)->base[(*lp)->size-1]; ++ptmp)  *ptmp = *(ptmp+1); (*lp)->base[(*lp)->size-1] = 0; --(*lp)->size;  return true;}bool remove_elem_val(list_ptr *lp, value_type elem) //按值刪除{ for(int i=0; i<(*lp)->size; ++i) if((*lp)->base[i] == elem){ for(int j=i; j<(*lp)->size-1; ++j) //所有符合要求的值都被刪除 (*lp)->base[j] = (*lp)->base[j+1];  (*lp)->base[(*lp)->size-1] = 0; --(*lp)->size; } return true;}bool remove_elem(list_ptr lp, const void* clue, DELETE_MODE mode) //外部接口,第三個參數選擇按位置或按值刪除模式{ assert(lp != NULL); if(list_empty(lp)){ //表空,不能刪 fprintf(stdout, "already empty, can not remove./n"); return false; }  if(mode == POSITION){ //參數為POSITION,按位置刪除 remove_elem_pos(&lp, *(int *)clue); } else{   //否則按值刪除 remove_elem_val(&lp, *(value_ptr)clue);  } return true;}void print_list(const seq_list sl) //打印函數{ if(sl.size == 0) fprintf(stdout, "nil list."); for(int i=0; i<sl.size; ++i) printf("%f ", sl.base[i]); printf("/n");}int compare(const void *vp1, const void* vp2) //比較函數{ return *(value_ptr)vp1 - *(value_ptr)vp2;}int locate_elem(const seq_list sl, const value_type elem,   int (*compare)(const void *, const void *)) //定位函數{ if(list_empty(&sl)){ fprintf(stdout, "list empty, con not locate./n"); } else{ for(int i=0; i<sl.size; ++i) if((*compare)(&sl.base[i], &elem) == 0)  //相等則找到,返回位置 return i+1; } return 0;}void sort_list(list_ptr lp, int (*compare)(const void *, const void *)) //排序函數{ assert(lp != NULL); qsort(lp->base, lp->size, sizeof(value_type), compare);   //調用系統快速排序}void merge_list(list_ptr lpa, list_ptr lpb, list_ptr combine,  int (*compare)(const void *, const void *)) //合并兩個順序表{ assert(lpa != NULL && lpb != NULL && combine != NULL); combine->base = (value_ptr)malloc(sizeof(value_type)  *(lpa->size+lpb->size)); //此處為新表申請空間,因此新表無需另外調用初始化函數,否則會發生內存泄漏 assert(combine->base != NULL); combine->capacity = combine->size = lpa->size+lpb->size;    value_ptr it_pc = combine->base; value_ptr it_pa=lpa->base; value_ptr it_pb=lpb->base;   while(it_pa<lpa->base+lpa->size && it_pb<lpb->base+lpb->size){  //由小到大插入新表 if(compare(it_pa, it_pb) <= 0) *it_pc++ = *it_pa++; else *it_pc++ = *it_pb++; } while(it_pa < lpa->base+lpa->size) //從上面while出循環只有兩種情況,此處為pa為插完,pb已插完,pa剩余元素直接插入,天然有序 *it_pc++ = *it_pa++; while(it_pb < lpb->base+lpb->size) //同理,若pb剩有元素,直接插入,天然有序 *it_pc++ = *it_pb++;}#endif /*seq_list*/

二:測試代碼

為保證通用性,不用int,用float測試。#include "seq_list.h"#define ARRAY_SIZE 10int main(){ value_type array[] = {39.1, 32.1, 10.1, 11.1, 22.1, 5.1, 36.1, 28.1, 46.1, 32.1}; seq_list list; //順序表1  init_list(&list); for(int i=0; i<ARRAY_SIZE; ++i) insert_elem(&list, 1, array[i]); printf("list:/n"); print_list(list); #if 1  int clue = 1;   //按順序刪除,刪除第一個元素 //value_type clue = 32.1; //按值刪除,刪除值為32.1的元素,需修改下面參數為VALUE printf("after remove:/n"); remove_elem(&list, &clue, POSITION); print_list(list);#endif#if 1  int found = locate_elem(list, 22.1, compare); //定位22.1元素所在位置 if(found >= 1) fprintf(stdout, "found %f at the position %d/n", list.base[found-1], found); else fprintf(stdout, "not found./n");#endif  sort_list(&list, compare); printf("list after sort:/n"); print_list(list); value_type array2[] = {98.1, 65.1, 4.1, 86.1, 34.1, 21.1, 86.1, 74.1, 93.1, 46.1}; seq_list list2; init_list(&list2); for(int i=0; i<ARRAY_SIZE; ++i) insert_elem(&list2, 1, array2[i]);  printf("list2:/n"); print_list(list2);  printf("list2 after sort:/n"); sort_list(&list2, compare); print_list(list2); seq_list new_list; //無需調用init函數初始化,因為新表在merge_list中會初始化。如果強行調用,那么會出現內存泄漏。  merge_list(&list, &list2, &new_list, compare); printf("new merge_list:/n"); print_list(new_list);  free(list.base); free(list2.base); free(new_list.base); //三個釋放,防止內存泄漏  return 0;}

三:測試結果

四:總結

以上就是本文的全部內容,希望對大家學習使用C語言能有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情日韩图片| 欧美激情一区二区三区在线视频观看| 国产精品99久久久久久www| 欧美体内谢she精2性欧美| 一区二区三区四区在线观看视频| 伊人一区二区三区久久精品| 欧美成人h版在线观看| 亚洲丁香婷深爱综合| 日韩a**站在线观看| 欧美日韩免费网站| 中文字幕视频一区二区在线有码| 国产精品精品久久久久久| 中文字幕久热精品在线视频| 欧美亚洲伦理www| 亚洲欧美精品伊人久久| 国产69精品久久久久久| 精品一区二区三区三区| 国产一区二区三区网站| 国产综合香蕉五月婷在线| 日韩免费在线播放| 欧美大全免费观看电视剧大泉洋| 俺也去精品视频在线观看| 91亚洲精品一区| 色诱女教师一区二区三区| 精品女同一区二区三区在线播放| 亚洲性日韩精品一区二区| 欧美最猛性xxxxx(亚洲精品)| 国产精品自产拍高潮在线观看| 国产91精品视频在线观看| 欧美在线视频一区| 亚洲欧美在线一区| 日本一区二区在线免费播放| 51视频国产精品一区二区| 亚洲欧洲在线免费| 日韩成人激情影院| 亚洲深夜福利在线| 亚洲第一精品夜夜躁人人躁| 综合网日日天干夜夜久久| 亚洲精品国产美女| 日韩电影中文字幕在线观看| 日韩中文字幕av| 久久精品视频中文字幕| 国色天香2019中文字幕在线观看| 中文字幕亚洲一区在线观看| 日本精品视频在线| 久久亚洲国产成人| 91老司机精品视频| 欧美在线观看一区二区三区| 亚洲欧美福利视频| 激情亚洲一区二区三区四区| 欧美一级bbbbb性bbbb喷潮片| 日本19禁啪啪免费观看www| 国产一区二区在线播放| 精品中文字幕在线2019| 91久久在线播放| 精品调教chinesegay| 欧美一级在线亚洲天堂| 亚洲免费精彩视频| 亚洲国产高清高潮精品美女| 国产精品大陆在线观看| 久久国产精品免费视频| 一区二区亚洲精品国产| 欧美亚洲国产成人精品| 国产免费久久av| 欧美日韩色婷婷| 国产精品日韩av| 国产精品自拍偷拍| 热门国产精品亚洲第一区在线| 国产成人a亚洲精品| 亚洲人成电影在线播放| 色综合久久中文字幕综合网小说| 欧美精品激情在线观看| 亚洲天堂免费在线| 亚洲精品成人久久久| 国产欧洲精品视频| 久久精品国产清自在天天线| 国产精品稀缺呦系列在线| 欧美激情视频三区| 国产做受高潮69| 成人午夜两性视频| 欧美俄罗斯乱妇| 欧美性猛交xxxx富婆弯腰| 亚洲在线视频观看| 欧美大片网站在线观看| 亚洲va欧美va国产综合剧情| 欧美日韩国产在线| 午夜免费在线观看精品视频| 亚洲一品av免费观看| 亚洲国产欧美久久| 97色在线观看免费视频| 91久久久久久国产精品| 红桃av永久久久| 欧美日韩国产丝袜美女| 午夜精品在线观看| 亚洲精品v天堂中文字幕| 九九热这里只有在线精品视| 久久久精品视频成人| 久久69精品久久久久久国产越南| 国产精品444| 欧美激情在线视频二区| 日韩视频亚洲视频| 8090成年在线看片午夜| 欧美视频在线免费| 中文字幕精品在线视频| 日韩欧中文字幕| 日韩在线观看免费av| 亚洲精品成a人在线观看| 亚洲国产高清福利视频| 国产精品av免费在线观看| 欧美高清视频在线| 久久夜精品va视频免费观看| 97视频在线观看免费高清完整版在线观看| 国模极品一区二区三区| 久久视频在线看| 91精品国产91| 亚洲一区二区三区成人在线视频精品| 九九久久久久99精品| 姬川优奈aav一区二区| 这里只有精品视频在线| 国产精品久久久久久久久久久新郎| 丝袜美腿亚洲一区二区| 中文字幕一区日韩电影| 精品日本高清在线播放| 日韩av最新在线观看| 国语自产偷拍精品视频偷| 久久精品国产2020观看福利| 欧美激情成人在线视频| 福利二区91精品bt7086| 大胆欧美人体视频| 国产97免费视| 国产欧美中文字幕| 亚洲综合一区二区不卡| 国产日韩中文在线| 国产精品久久视频| 国产69精品久久久久99| 国产一区二区三区精品久久久| 午夜剧场成人观在线视频免费观看| 欧美亚洲第一页| 亚洲免费人成在线视频观看| 91国内精品久久| 欧美韩国理论所午夜片917电影| 亚洲已满18点击进入在线看片| 欧美激情成人在线视频| 欧美老女人性生活| 中文字幕亚洲综合久久筱田步美| 亚洲精品国产电影| 91亚洲一区精品| 国内精久久久久久久久久人| 久久久伊人日本| 欧美亚洲国产日韩2020| 日韩动漫免费观看电视剧高清| 欧美精品videosex性欧美| 97视频免费在线看| 精品视频一区在线视频| 亚洲一品av免费观看| 午夜精品久久久久久久久久久久久| 青青久久av北条麻妃海外网| 国产亚洲激情视频在线| 亚洲综合在线中文字幕| 成人黄色免费在线观看| 久久精品国产免费观看| 岛国av一区二区在线在线观看| 亚洲男女自偷自拍图片另类| 国产女精品视频网站免费|