顺序表c语言的程序代码

合集下载

数据结构经典题目及c语言代码

数据结构经典题目及c语言代码

数据结构经典题目及c语言代码一、线性表1. 顺序表顺序表是一种利用连续存储空间存储元素的线性表。

以下是一个顺序表的经典题目及C语言代码实现:```c#define MaxSize 50typedef struct {int data[MaxSize]; // 存储元素的数组int length; // 顺序表的当前长度} SeqList;// 初始化顺序表void initList(SeqList *L) {L->length = 0;}// 插入元素到指定位置void insert(SeqList *L, int pos, int elem) {if (pos < 1 || pos > L->length + 1) {printf("插入位置无效\n");return;}if (L->length == MaxSize) {printf("顺序表已满,无法插入\n"); return;}for (int i = L->length; i >= pos; i--) { L->data[i] = L->data[i - 1];}L->data[pos - 1] = elem;L->length++;}// 删除指定位置的元素void delete(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("删除位置无效\n");return;}for (int i = pos - 1; i < L->length - 1; i++) {L->data[i] = L->data[i + 1];}L->length--;}// 获取指定位置的元素值int getElement(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("位置无效\n");return -1;}return L->data[pos - 1];}```2. 链表链表是一种利用非连续存储空间存储元素的线性表。

c语言实现顺序表的基本操作

c语言实现顺序表的基本操作

c语⾔实现顺序表的基本操作数据结构顺序表操作复制代码代码如下:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define LIST_INIT_SIZE 100#define LISINCREMENT 10#define ElemType int#define Status inttypedef struct Sq{ElemType *elem;int length;int listsize;}SqList;Status InitList(SqList *L){L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L->elem)return 0;L->length=0;L->listsize=LIST_INIT_SIZE;return 1;}Status ListInsert(SqList *L,int i,ElemType e){int *q,*p;if(i<1||i>L->length)return 0;if(L->length>L->listsize){ElemType *newbase=(ElemType*)realloc(L->elem,(LIST_INIT_SIZE+LISINCREMENT)*sizeof(ElemType)); if(!newbase)return 0;L->elem=newbase;L->listsize+=(LISINCREMENT);}q=&(L->elem[i-1]);for(p=&(L->elem[L->length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L->length;return 1;}Status ListDelete(SqList *L,int i,ElemType e){int *p,*q;if(i<1||i>L->length)return 0;p=&(L->elem[i-1]);e=*p;q=L->elem+L->length-1;for(++p;p<=q;++p)*(p-1)=*p;--L->length;return 1;}int main(void){int i,j,e,lo,temp;SqList *L=(SqList*)malloc(sizeof(SqList)); InitList(L);printf("请输顺序表的长度:\n");scanf("%d",&L->length);printf("请输⼊顺序表的各个元素:\n");for(i=0;i<L->length;++i)scanf("%d",&L->elem[i]);printf("输⼊的顺序表是:\n");for (i=0;i<L->length;++i){printf("%d ",L->elem[i]);}printf("\n");printf("请输⼊插⼊的位置以及节点:\n"); scanf("%d%d",&j,&e);ListInsert(L,j,e);printf("插⼊后的顺序表为:\n");for (i=0;i<L->length;++i){printf("%d ",L->elem[i]);}printf("\n");printf("请输⼊要删除的位置:");scanf("%d",&lo);ListDelete(L,lo,temp);for (i=0;i<L->length;++i){printf("%d ",L->elem[i]);}printf("\n");free(L);return 0;}。

顺序表的查找c语言代码

顺序表的查找c语言代码

顺序表的查找c语言代码
顺序表是一种线性表,它的元素在物理上是连续存储的。

在顺序表中,每个元素都有一个唯一的下标,也称为索引,可以通过索引来访问顺序表中的元素。

顺序表的查找是指在顺序表中查找某个元素是否存在,并返回其位置或者不存在的信息。

顺序表的查找可以分为两种:顺序查找和二分查找。

顺序查找是从顺序表的第一个元素开始,逐个比较,直到找到目标元素或者遍历完整个顺序表。

二分查找是在有序的顺序表中进行的,每次将查找区间缩小一半,直到找到目标元素或者查找区间为空。

下面是顺序查找的C语言代码:
```c
int sequential_search(int *a, int n, int key)
{
int i;
for (i = 0; i < n; i++)
{
if (a[i] == key)
{
return i;
}
}
return -1;
}
```
这个函数接受三个参数:一个整型数组a,数组的长度n,和要查找的元素key。

函数返回key在数组a中的位置,如果不存在则返回-1。

顺序查找的时间复杂度是O(n),其中n是顺序表的长度。

在最坏情况下,需要遍历整个顺序表才能找到目标元素,因此顺序查找的效率不高。

如果顺序表是有序的,可以使用二分查找来提高查找效率。

顺序表的查找是数据结构中的基本操作之一,也是算法设计中的重要内容。

在实际应用中,我们需要根据具体的情况选择合适的查找算法,以提高程序的效率。

C语言顺序表的实现代码

C语言顺序表的实现代码

C语⾔顺序表的实现代码本⽂实例为⼤家分享了C语⾔实现顺序表的具体代码,供⼤家参考,具体内容如下seqlist.h#ifndef __SEQLIST_H__#define __SEQLIST_H__#include<cstdio>#include<malloc.h>#include<assert.h>#define SEQLIST_INIT_SIZE 8#define INC_SIZE 3 //空间增量的⼤⼩typedef int ElemType;typedef struct Seqlist {ElemType *base;int capacity; //顺序表容量int size; //表的⼤⼩}Seqlist;bool Inc(Seqlist *list);//增加顺序表的容量void InitSeqlist(Seqlist *list); //初始化顺序表void push_back(Seqlist *list, ElemType x); //在顺序表的末尾插⼊元素void push_front(Seqlist *list, ElemType x); //在顺序表的头部插⼊元素void show_list(Seqlist *list); //显⽰顺序表中的元素void pop_back(Seqlist *list); //删除顺序表最后⼀个元素void pop_front(Seqlist *list); //删除顺序表第⼀个元素void insert_pos(Seqlist *list, int pos, ElemType x);//在顺序表的选定位置上插⼊数据int find(Seqlist *list, ElemType key); //在顺序表中查找元素key的下标int length(Seqlist *list);//求顺序表的长度void delete_pos(Seqlist *list, int pos); //删除顺序表中特定位置的数据元素void delete_val(Seqlist *list, int key);//删除顺序表中值为key的数据元素void sort(Seqlist *list);//冒泡排序void reverse(Seqlist *list);//逆置顺序列表void clear(Seqlist *list);//清除顺序表中的所有元素void destroy(Seqlist *list);//摧毁顺序表void merge(Seqlist *lt, Seqlist *la, Seqlist *lb);//合并两个顺序列表#endif //__SEQLIST_H__seqlist.cpp#include"seqlist.h"bool Inc(Seqlist *list) {ElemType *newbase = (ElemType*)realloc(list, sizeof(ElemType)*(list->capacity + INC_SIZE)); //重新分配内存空间if (newbase == NULL) {printf("内存空间已满,⽆法再分配内存空间!\n");return false;}list->base = newbase;list->capacity += INC_SIZE;return true;}void InitSeqlist(Seqlist *list) {list->base = (ElemType*)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);assert(list->base != NULL);list->capacity = SEQLIST_INIT_SIZE;list->size = 0;}void push_back(Seqlist *list, ElemType x) {if (list->size >= list->capacity && !Inc(list)) { //Inc(list)⽤来判断增加顺序表容量是否成功,只有在失败的情况下才会进⼊if语句中 printf("顺序表容量已满,⽆法再在表尾继续插⼊新元素!\n");return;}list->base[list->size] = x;list->size++;}void push_front(Seqlist *list, ElemType x) {if (list->size >= list->capacity && !Inc(list)) {printf("顺序表容量已满,⽆法再在表头插⼊新元素!\n"); return;}for (int i = list->size;i > 0;i--) {list->base[i] = list->base[i - 1];}list->base[0] = x;list->size++;}void show_list(Seqlist *list) {for (int i = 0;i < list->size;i++) {printf("%d ", list->base[i]);}printf("\n");}void pop_back(Seqlist *list) {if (list->size == 0) {printf("顺序表已空,⽆法再在表尾删除元素!\n");return;}list->size--;}void pop_front(Seqlist *list) {if (list->size == 0) {printf("顺序表已空,⽆法再在表头删除元素!\n");return;}for (int i = 0;i < list->size - 1;i++) {list->base[i] = list->base[i + 1];}list->size--;}void insert_pos(Seqlist *list, int pos, ElemType x) {if (pos<0 || pos>list->size) {printf("插⼊位置不合法,⽆法插⼊元素!\n");return;}if (list->size >= list->capacity && !Inc(list)) {printf("顺序表容量已满,⽆法在插⼊新的元素!\n");return;}for (int i = list->size;i > pos;i--) {list->base[i] = list->base[i - 1];}list->base[pos] = x;list->size++;}int find(Seqlist *list, ElemType key) {for (int i = 0;i < list->size;i++) {if (list->base[i] == key)return i;}return -1;}int length(Seqlist *list) {return list->size;}void delete_pos(Seqlist *list, int pos) {if (pos < 0 || pos >= list->size) {printf("删除位置不合法,⽆法删除元素!\n");return;}for (int i = pos;i < list->size - 1;i++) {list->base[i] = list->base[i + 1];}list->size--;}void delete_val(Seqlist *list, int key) {int pos = find(list, key);if (pos == -1) {printf("顺序表中没有这个元素!\n");return;}delete_pos(list, pos);}void sort(Seqlist *list) {for (int i = 0;i < list->size - 1;i++) {//排序的趟数(例如5个数据需要⽐较4趟)for (int j = 0;j < list->size - 1 - i;j++) {//每⼀趟⽐较中的⽐较次数(例如5个数据在第0趟需要⽐较4次) if (list->base[j] > list->base[j + 1]) {ElemType temp = list->base[j];list->base[j] = list->base[j + 1];list->base[j + 1] = temp;}}}}void reverse(Seqlist *list) {if (list->size == 0 || list->size == 1) return;int low = 0, high = list->size - 1;while (low < high) {ElemType temp = list->base[low];list->base[low] = list->base[high];list->base[high] = temp;low++;high--;}}void clear(Seqlist *list) {list->size = 0;}void destroy(Seqlist *list) {free(list->base);list->base = NULL;list->capacity = 0;list->size = 0;}void merge(Seqlist *lt, Seqlist *la, Seqlist *lb) {lt->capacity = la->size + lb->size;lt->base = (ElemType*)malloc(sizeof(ElemType)*lt->capacity);assert(lt->base != NULL);int ia = 0, ib = 0, ic = 0;while (ia < la->size&&ib < lb->size) {if (la->base[ia] < lb->base[ib]) {lt->base[ic++] = la->base[ia++];}else {lt->base[ic++] = lb->base[ib++];}}while (ia < la->size) {lt->base[ic++] = la->base[ia++];}while (ib < lb->size) {lt->base[ic++] = lb->base[ib++];}lt->size = la->size + lb->size;show_list(lt);}main.cpp#include"seqlist.h"void main() {Seqlist list;InitSeqlist(&list);ElemType item;int select = 1;while (select) {printf("*******************************************\n");printf("*[1] push_back [2] push_front *\n");printf("*[3] show_list [4] pop_back *\n");printf("*[5] pop_front [6] insert_pos *\n");printf("*[7] find [8] length *\n");printf("*[9] delete_pos [10] delete_value *\n");printf("*[11] sort [12] reverse *\n");printf("*[13] clear [14] merge *\n");printf("*[0] quit_system *\n");printf("*******************************************\n");printf("请选择:>>");scanf("%d", &select);if (select == 0) break;switch (select) {case 1:printf("请输⼊要插⼊的数据(-1结束):>");while (scanf("%d", &item), item != -1) {//先输⼊item的值,只要item不等于-1就接着循环 push_back(&list, item);}break;case 2:printf("请输⼊要插⼊的数据(-1结束):>");while (scanf("%d", &item), item != -1) {push_front(&list, item);}break;case 3:show_list(&list);break;case 4:pop_back(&list);break;case 5:pop_front(&list);break;case 6:printf("请输⼊要插⼊的数据:>");scanf("%d", &item);printf("请输⼊要插⼊的位置:>");scanf("%d", &pos);insert_pos(&list, pos, item);break;case 7:printf("请输⼊要查找的数据:>");scanf("%d", &item);pos = find(&list, item);if (pos == -1)printf("查找的数据元素不在顺序表中!\n");elseprintf("查找的数据元素在顺序表中的下标位置为%d\n", pos);break;case 8:printf("顺序表的长度为%d\n", length(&list));break;case 9:printf("请输⼊要删除数据在顺序表中的下标位置:>");scanf("%d", &pos);delete_pos(&list, pos);break;case 10:printf("请输⼊要删除数据的值:>");scanf("%d", &item);delete_val(&list, item);break;case 11:sort(&list);break;case 12:reverse(&list);break;case 13:clear(&list);break;Seqlist mylist, yourlist;ElemType item1, item2;InitSeqlist(&mylist);InitSeqlist(&yourlist);printf("请输⼊顺序表1中的元素值(-1结束):>");while (scanf("%d", &item1), item1 != -1) {push_back(&mylist, item1);}printf("请输⼊顺序表2中的元素值(-1结束):>");while (scanf("%d", &item2), item2 != -1) {push_back(&yourlist, item2);}merge(&list, &mylist, &yourlist);destroy(&mylist);destroy(&yourlist);break;default:printf("输⼊的选择错误!请重新输⼊!\n");break;}}destroy(&list);}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

c语言直接排序算法代码

c语言直接排序算法代码

c语言直接排序算法代码C语言直接排序算法代码概述:直接排序算法,也称为冒泡排序,是一种简单的排序算法。

它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

实现:C语言中实现直接排序算法代码如下:```c#include <stdio.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;void bubbleSort(int arr[], int n) {int i, j;for(i = 0; i < n - 1; i++) {for(j = 0; j < n - i - 1; j++) {if(arr[j] > arr[j+1]) {swap(&arr[j], &arr[j+1]);}}}}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]);bubbleSort(arr, n);printf("Sorted array: \n");for(int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;}分析:- swap函数:用于交换两个整数的值。

- bubbleSort函数:用于对数组进行冒泡排序。

- main函数:用于测试排序算法的正确性。

具体实现:- 在bubbleSort函数中,使用两个嵌套循环,外循环控制排序的轮数,内循环控制每一轮中需要比较的元素个数。

- 在内循环中,如果相邻两个元素的顺序错误,则调用swap函数交换它们的值。

- 最终得到一个排好序的数组。

(完整版)C语言代码大全

(完整版)C语言代码大全

摘自宋鲁生程序设计大赛乘法口诀表#include <stdio.h>#include <conio.h>void main(void){int i,j,x,y;clrscr();printf("\n\n * * * 乘法口诀表* * * \n\n");x=9;y=5;for(i=1;i<=9;i++){gotoxy(x,y);printf("%2d ",i);x+=3;}x=7;y=6;for(i=1;i<=9;i++){gotoxy(x,y);printf("%2d ",i);y++;}x=9;y= 6;for(i=1;i<=9;i++){for(j=1;j<=9;j++){gotoxy(x,y);printf("%2d ",i*j);y++;}y-=9;x+=3;}printf("\n\n");}用一维数组统计学生成绩#include <stdio.h>void main(){char SelectKey,CreditMoney,DebitMoney;while(1){do{clrscr();puts("=========================");puts("| Please select key: |");puts("| 1. Quary |");puts("| 2. Credit |");puts("| 3. Debit |");puts("| 4. Return |");puts("=========================");SelectKey = getch();}while( SelectKey!='1' && SelectKey!='2' && SelectKey!='3' &&SelectKey!='4' );switch(SelectKey){case '1':clrscr();puts("================================");puts("| Your balance is $1000. |");puts("| Press any key to return... |");puts("================================");getch();break;case '2':do{clrscr();puts("==================================");puts("| Please select Credit money: |");puts("| 1. $50 |");puts("| 2. $100 |");puts("| 3. Return |");puts("==================================");CreditMoney = getch();}while( CreditMoney!='1' && CreditMoney!='2' && CreditMoney!='3' );switch(CreditMoney){}break; case '3':do{ case '1':clrscr();puts("=========================================");puts("| Your Credit money is $50,Thank you! |");puts("| Press any key to return... |");puts("=========================================");getch();break;case '2':clrscr();puts("==========================================");puts("| Your Credit money is $100,Thank you! |");puts("| Press any key to return... |");puts("==========================================");getch();break;case '3':break;clrscr();puts("====================================");puts("| Please select Debit money: |");puts("| 1. $50 |");puts("| 2. $100 |");puts("| 3. $500 |");puts("| 4. $1000 |");puts("| 5. Return |");puts("====================================");DebitMoney = getch();}while( DebitMoney!='1' && DebitMoney!='2' && DebitMoney!='3' &&DebitMoney!='4' && DebitMoney!='5' );switch(DebitMoney){case '1':clrscr();puts("===========================================");puts("| Your Debit money is $50,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '2':clrscr();puts("===========================================");puts("| Your Debit money is $100,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '3':clrscr();puts("===========================================");puts("| Your Debit money is $500,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '4':clrscr();puts("===========================================");puts("| Your Debit money is $1000,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '5':break;}break;case '4':clrscr();puts("================================");puts("| Thank you for your using! |");puts("| Good bye! |");puts("================================");return;}}模拟ATM(自动柜员机)界面#include <stdio.h> void main(){int Password=0,Number=0,price=58,i=0;while( Password != 1234 ){if( i >= 3 )return;}i=0; i++;puts("Please input Password: "); scanf("%d",&Password);while( Number!=price ){do{puts("Please input a number between 1 and 100: ");scanf("%d",&Number);printf("Your input number is %d\n",Number);}while( !(Number>=1 && Number<=100) );if( Number >= 90 ){printf("Too Bigger! Press any key to try again!\n");}else if( Number >= 70 && Number < 90 ){printf("Bigger!\n");}else if( Number >= 1 && Number <= 30 ){printf("Too Small! Press any key to try again!\n");}else if( Number > 30 && Number <= 50 ){}else{printf("Small! Press any key to try again!\n");if( Number == price ){printf("OK! You are right! Bye Bye!\n");}else if( Number < price ){printf("Sorry,Only a little smaller! Press any key to try again!\n");}else if( Number > price ){printf(" Sorry, Only a little bigger! Press any key to try again!\n");}getch();}}用二维数组实现矩阵转置/* 用二维数组实现矩阵的转置*/#include <stdio.h>#define ROW 3#define COL 4main(){int matrixA[ROW][COL],matrixB[COL][ROW];int i,j; clrscr();printf("Enter elements of the matrixA,");printf("%d*%d:\n",ROW,COL);for( i=0; i<ROW; i++ ){for( j=0; j<COL; j++ ){scanf("%d",&matrixA[i][j]);}}for( i=0; i<ROW; i++ ){for( j=0; j<COL; j++ ){matrixB[j][i] = matrixA[i][j];}}printf("MatrixB,");printf("%d*%d:\n",COL,ROW);for( i=0; i<COL; i++ ){for( j=0; j<ROW; j++ ){printf("%8d",matrixB[i][j]);}printf("\n");}printf("\n Press Any Key to Quit... \n");getch();}求解二维数组的最大/最小元素#define MAXN 20int a[MAXN][MAXN];main(){int min, /* 存储最小值*/max; /* 存储最大值*/int row,col,n;clrscr();printf("Please input the order of the matrix:\n");/* 输入方阵的阶次*/ scanf("%d",&n);printf("Please input the elements of the matrix,\n from a[0][0] to a[%d][%d]:\n",n-1,n-1);for(row=0;row<n;row++)for(col=0;col<n;col++)scanf("%d",&a[row][col]);for(min=a[0][0],row=0;row<n;row++){/* 从每行选出最大数*/for(max=a[row][0],col=1;col<n;col++)/*从row 行选出最大数*/if(max<a[row][col])max=a[row][col];if(min>max)/* 保存至row 行的最小数*/min=max;}printf("The minimum of maximum number is %d\n",min);for(max=a[0][0],row=0;row<n;row++){/* 每行选出最小数*/for(min=a[row][0],col=1;col<n;col++)/* 从row 行选出最小数*/ if(min>a[row][col])min=a[row][col];if(max<min)/*保存至row 行的最大数*/max=min;}printf("The maximum of minimum numbers is %d\n",max);printf("\nPress any key to quit...\n");getch();}利用数组求前n 个质数#define N 50main(){int primes[N];int pc,m,k; clrscr();printf("\n The first %d prime numbers are:\n",N);primes[0]=2;/*2 是第一个质数*/pc =1;/*已有第一个质数*/m =3;/*被测试的数从3 开始*/while(pc<N){/*调整m 使它为下一个质数*/k=0;while(primes[k]*primes[k]<=m)if(m%primes[k]==0){/*m 是合数*/m+=2;/*让m 取下一个奇数*/k=1;/*不必用primes[0]=2 去测试m,所以k 从一开始*/}elsek++;/*继续用下一个质数去测试*/primes[pc++]=m;m+=2;/*除2 外,其余质数均是奇数*/}/*输出primes[0]至primes[pc-1]*/for(k=0;k<pc;k++)printf("%4d",primes[k]);printf("\n\n Press any key to quit...\n ");getch();}编制万年历#include "stdio.h"long int f(int year,int month){/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/if(month<3) return year-1;else return year;} long int g(int month){/*g(月)=月+13,如月<3;否则,g(月)=月+1*/if(month<3) return month+13;else return month+1;} long int n(int year,int month,int day){/*N=1461*f(年、月)/4+153*g(月)/5+日*/return 1461L*f(year,month)/4+153L*g(month)/5+day;} int w(int year,int month,int day){/*w=(N-621049)%7(0<=w<7)*/return(int)((n(year,month,day)%7-621049L%7+7)%7);} int date[12][6][7];int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};main(){int sw,leap,i,j,k,wd,day;int year;/*年*/char title[]="SUN MON TUE WED THU FRI SAT";clrscr();printf("Please input the year whose calendar you want to know: ");/*输入年*/scanf("%d%*c",&year);/*输入年份值和掠过值后的回车*/sw=w(year,1,1);leap=year%4==0&&year%100||year%400==0;/*判闰年*/for(i=0;i<12;i++)for(j=0;j<6;j++)for(k=0;k<7;k++)date[i][j][k]=0;/*日期表置0*/for(i=0;i<12;i++)/*一年十二个月*/for(wd=0,day=1;day<=day_tbl[leap][i];day++){/*将第i+1 月的日期填入日期表*/date[i][wd][sw]=day;sw=++sw%7;/*每星期七天,以0 至6 计数*/if(sw==0) wd++;/*日期表每七天一行,星期天开始新的一行*/} printf("\n|==================The Calendar of Year %d=====================|\n|",year);for(i=0;i<6;i++){/*先测算第i+1 月和第i+7 月的最大星期数*/for(wd=0,k=0;k<7;k++)/*日期表的第六行有日期,则wd!=0*/wd+=date[i][5][k]+date[i+6][5][k];wd=wd?6:5;printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);for(j=0;j<wd;j++){printf(" ");/*输出四个空白符*//*左栏为第i+1 月,右栏为第i+7 月*/for(k=0;k<7;k++)if(date[i][j][k])printf("%4d",date[i][j][k]);else printf(" ");printf(" ");/*输出十个空白符*/for(k=0;k<7;k++)if(date[i+6][j][k])printf("%4d",date[i+6][j][k]);else printf(" ");printf(" |\n|");}/*scanf("%*c");/*键入回车输出下一个月的日历*/}puts("=================================================================|") ;puts("\n Press any key to quit...");getch();}对数组元素排序rest(int a[], int n){int i,low,high,t; for(i=0,low=0,high=n-1;i<=high;) {if(a[i]>0){/*a[i]与a[high]交换,随之high 减1*/t=a[i];a[i]=a[high];a[high]=t;high--;}else if(a[i]==0)i++; /* 掠过该元素*/else{/*a[i]与a[low]交换,随之low 增1, i 增1*/t=a[i];a[i]=a[low];a[low]=t;low++; i++;}}}int s[]={8,4,0,-1,6,0,-5};main(){int i;clrscr();printf("\n The arry before rest is:\n");for(i=0;i<sizeof(s)/sizeof(s[0]);i++)printf("%4d",s[i]);rest(s,sizeof(s)/sizeof(s[0]));printf("\n The arry after rest is:\n");for(i=0;i<sizeof(s)/sizeof(s[0]);i++)printf("%4d",s[i]);printf("\n Press any key to quit...\n");getch();}任意进制数的转换/* 函数trans 将无符号整数n 翻译成d(2<=d<=16)进制表示的字符串s */ #define M sizeof(unsigned int)*8int trans(unsigned n, int d, char s[]){static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符*/char buf[M+1];int j, i = M;if(d<2||d>16){s[0]='\0'; /* 不合理的进制,置s 为空字符串*/return 0; /* 不合理的进制,函数返回0 */}buf[i]='\0';do{buf[--i]=digits[n%d]; /*译出最低位,对应字符存入对应工作数组中*/n/=d;}while(n);/* 将译出在工作数组中的字符串复制到s */for(j=0;(s[j]=buf[i])!='\0';j++,i++);/* 其中控制条件可简写成s[j]=buf[i] */return j;}/* 主函数用于测试函数trans() */main(){unsigned int num = 253;int scale[]={2,3,10,16,1};char str[33];int i;clrscr();for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++){if(trans(num,scale[i],str))printf("%5d = %s(%d)\n",num,str,scale[i]);elseprintf("%5d => (%d) Error! \n",num,scale[i]);}printf("\n Press any key to quit...\n");getch();}判断回文数/* 函数circle 用于判断正整数n 的d 进制数表示形式是否是回文数*/ int circle(int n, int d){int s=0,m=n;while(m){s=s*d+m%d;m/=d;}return s==n;}/* main 函数用于测试circle 函数*/int num[]={232,27,851};int scale[]={2,10,16};main(){int i,j;clrscr();for(i=0;i<sizeof(num)/sizeof(num[0]);i++)for(j=0;j<sizeof(scale)/sizeof(scale[0]);j++)if(circle(num[i],scale[j]))printf("%d -> (%d) is a Circle Number!\n",num[i],scale[j]);elseprintf("%d -> (%d) is not a Circle Number!\n",num[i],scale[j]);printf("\n Press any key to quit...\n");getch();}求解钢材切割的最佳订单#include <stdio.h>#define N 20#define DELTA 2int bestlen;int bestsele[N];int sele[N];int n;int orderlen[N];int total;main(){int i;clrscr();printf("\n Please enter total length of the steel:\n");/* 输入钢材总长*/scanf("%d",&total);printf("\n Please enter number of order:\n"); /* 输入定单数*/ scanf("%d",&n);printf("\n Please enter the orders:\n"); /* 输入各定单*/for(i=0;i<n;i++)scanf("%d",&orderlen[i]);bestlen=0; /*最佳解用料的初值*/for(i=0;i<n;i++)sele[i]=bestsele[i]=0; /*置当前选择和最佳选择初值*/try(); /* 调用函数求解*/for(i=0;i<n;i++) /* 输出结果*/if(bestsele[i])printf("order %d length = %d\n",i+1,orderlen[i]);printf("\n Press any key to quit...");getch();}try(){int i,len;for(len=i=0;i<n;i++) /* 求当前选中的用料量*/if(sele[i])len+=orderlen[i]+DELTA;if(len-DELTA<=total) /* 注意最后一段可能不需要切割*/{if(bestlen < len){/* 找到一个更好的解*/bestlen = len;for(i=0;i<n;i++)bestsele[i]=sele[i];}for(i=0;i<n;i++) /* 对所有未选定单逐一作选中尝试循环*/if(!sele[i]){sele[i]=1; /* 做选中尝试*/try();sele[i]=0;}}}指向数组的指针main(){int x,y,z; /* 定义三个int 型变量*/int *xp = &x, /* 定义指针变量xp,并赋值为x 的地址,使xp 指向x */ *yp = &y, /* 定义指针变量yp,并赋值为y 的地址,使yp 指向y */ *zp = &z; /* 定义指针变量zp,并赋值为z 的地址,使zp 指向z */int t;printf("\nPlease input x,y,z:\n");scanf("%d%d%d",xp,yp,zp); /* 通过变量的指针,为变量输入值*/if(*xp>*yp) /* 通过指向变量的指针引用变量的值*/{t=*xp; /* 通过指向变量的指针引用变量的值*/*xp=*yp;/* 通过指向变量x 的指针xp,引用变量x 的值*/*yp=t; /* 通过指向变量y 的指针yp,引用变量y 的值*/}if(*xp>*zp) /* 通过指向变量的指针,引用变量的值*/{t=*xp; /* 通过指向变量x 的指针xp,引用变量x 的值*/*xp=*zp;/* 通过指向变量x 的指针xp,引用变量x 的值*/*zp=t; /* 通过指向变量z 的指针zp,引用变量z 的值*/}if(*yp>*zp) /* 通过指向变量的指针,引用变量的值*/{t=*yp; /* 通过指向变量的指针,引用变量的值*/*yp=*zp;/* 通过指向变量y 的指针yp,引用变量y 的值*/*zp=t;/* 通过指向变量z 的指针zp,引用变量z 的值*/}printf("x = %d\ty = %d\tz = %d\n",x,y,z);printf("\nPress any key to quit...\n");getch();}阿拉伯数字转换为罗马数字#include <stdio.h>#define ROWS 4#define COLS 4int nums[ROWS][COLS]={{1000,1000,1000,1000},{900,500,400,100},{90,50,40,10},{9,5,4,1}};char *roms[ROWS][COLS]={{"m","m","m","m"}, {"cm","d","cd","c"},{"xc","l","xl","x"},{"ix","v","iv","i"}}; main(int argc,char *argv[ ]){int low,high;char roman[25]; if(argc<2){ printf("Usage:roman decimal_number\n");/*运行程序需带整数参数*/}high=low=atoi(argv[1]);/*将第一个参数转换成整数*/checknum(low);if(argc>2){/*带两个参数*/high=atoi(argv[2]);checknum(high);if(low>high){low=high;high=atoi(argv[1]);}}elselow=1;for(;low<=high;low++){to_roman(low,roman);printf("%d\t%s\n",low,roman);}} checknum(int val)/*检查参数合理性*/{if(val<1||val>9999){printf("The number must be in range 1..9999.\n");exit(0);}}to_roman(int decimal,char roman[ ])/*将整数转换成罗马数字表示*/ {int power,index;roman[0]='\0';for(power=0;power<ROWS;power++)for(index=0;index<COLS;index++)while(decimal>=nums[power][index]){strcat(roman,roms[power][index]);decimal-=nums[power][index];}}通讯录的输入输出#include <stdio.h>#define ZIPLEN 10#define PHONLEN 15/*struct addr 类型定义*/ struct addr{char *name;/*姓名*/char *address;/*地址*/char zip[ZIPLEN];/*邮政编码*/char phone[PHONLEN];/*电话号码*/}; main()/*本主函数示意上述输入输出函数的用法*/{struct addr p[100];int i,j;clrscr();for(i=0;readaddr(p+i);i++);for(j=0;j<i;j++) writeaddr(p+j);puts("\n Press any key to quit...");getch();} /* 函数readaddr 用于输入一个通信录函数*/int readaddr(struct addr *dpt){int len;char buf[120];/*输入字符串的缓冲区*/ printf("\nPlease input theName:\n");/*输入姓名*/if(scanf("%s",buf)==1){len=strlen(buf);dpt->name=(char *)malloc(len+1);/*申请存贮姓名的空间*/ strcpy(dpt->name,buf);}else return 0;/*Ctrl+Z 结束输入*/printf("Please input the Address:\n");/*输入地址*/if(scanf("%s",buf)==1){len=strlen(buf);dpt->address=(char *)malloc(len+1);/*申请存贮地址的空间*/ strcpy(dpt->address,buf);}else{/*Ctrl+Z 结束输入*/free(dpt->name);/*释放存贮姓名的空间*/return 0;}printf("Please input the Zip code:\n");/*输入邮编*/if(scanf("%s",buf)==1)strncpy(dpt->zip,buf,ZIPLEN-1);else{free(dpt->name);/*释放存贮姓名的空间*/free(dpt->address);/*释放存贮地址的空间*/return 0;/*Ctrl+Z 结束输入*/}printf("Please input the Phone number:\n");/*输入电话号码*/ if(scanf("%s",buf)==1)strncpy(dpt->phone,buf,PHONLEN-1);else{free(dpt->name);free(dpt->address);return 0;/*Ctrl+Z 结束输入*/}return 1;} /* 函数writeaddr 用于输出通讯录*/int writeaddr(struct addr*dpt){printf("Name : %s\n", dpt->name);/* 输出姓名*/printf("Address : %s\n", dpt->address);/*输出地址*/printf("Zip : %s\n", dpt->zip);/* 输出邮编*/printf("Phone : %s\n\n", dpt->phone);/*输出电话号码*/}扑克牌的结构表示enum suits{CLUBS,DIAMONDS,HEARTS,SPADES}; struct card{enum suits suit;char value[3];};struct card deck[52];char cardval[][3]= {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};char suitsname[][9]={"CLUBS","DIAMONDS","HEARTS","SPADES"}; main() {int i,j;enum suits s;clrscr();for(i=0;i<=12;i++)for(s=CLUBS;s<=SPADES;s++){j=i*4+s;deck[j].suit=s;strcpy(deck[j].value,cardval[i]);}for(j=0;j<52;j++)printf("(%s%3s)%c",suitsname[deck[j].suit],deck[j].value,j%4==3?'\n':'\t');puts("\nPress any key to quit...");getch();}用“结构”统计学生成绩#include <stdio.h>#define N 200#define SCORES 5#define NUMLEN 10struct std_type{char no[NUMLEN];/*学号*/char *name;/*名字符串指针*/int scores[SCORES];/*五门功课的成绩*/};struct std_type students[N];int order[N];int total[N]; /*[函数]输入一个学生信息函数*/int readastu(struct std_type *spt){int len,j;char buf[120];/*输入字符串的缓冲区*/ printf("\nNumber : ");/*输入学号*/if(scanf("%s",buf)==1)strncpy(spt->no,buf,NUMLEN-1);elsereturn 0;/*Ctrl+Z 结束输入*/printf("Name : ");/*输入姓名*/if(scanf("%s",buf)==1){len=strlen(buf);spt->name=(char *)malloc(len+1);/*申请存贮姓名的空间*/ strcpy(spt->name,buf);}else return 0;/*Ctrl+Z 结束输入*/printf("Scores : ");/*输入成绩*/for(j=0;j<SCORES;j++)if(scanf("%d",spt->scores+j)!=1)break;if(j==0)/*一个成绩也未输入*/{free(spt->name);/*释放存贮姓名的空间*/return 0;}for(;j<SCORES;j++)/*少数未输入的成绩用0 分代之*/ spt->scores[j]=0;return 1;} /*[函数]输出一个学生信息的函数*/int writeastu(struct std_type *spt){int i; printf("Number : %s\n",spt->no);/*输出学号*/printf("Name : %s\n",spt->name);/*输出姓名*/printf("Scores : ");/* 输出成绩*/for(i=0;i<SCORES;i++)printf("%4d",spt->scores[i]);printf("\n\n");} main(){int n,i,j,t; clrscr();for(n=0;readastu(students+n);n++);/*采用冒泡法对学生信息数组排序*/for(i=0;i<n;i++){order[i]=i;/* 预置第i 个输入的学生*/for(t=0,j=0;j<SCORES;j++)/*求第i 个学生的总分*/t+=students[i].scores[j];total[i]=t;}/*冒泡排序*/for(i=0;i<n-1;i++)/*共扫视n-1 遍*/for(j=0;j<n-1-i;j++)if(total[order[j]]<total[order[j+1]]){/*交换名次*/t=order[j];order[j]=order[j+1];order[j+1]=t;}for(j=0;j<n;j++)/* 输出*/writeastu(students+order[j]);printf("\n Press any key to quit...\n");getch();}报数游戏#include <stdio.h>struct ele{int no;struct ele *link;}main(){int n,m,i;struct ele *h,*u,*p;clrscr();printf("Please input n&m:\n");scanf("%d%d",&n,&m);/*输入n 和m*/h=u=(struct ele *)malloc(sizeof(struct ele));/*形成首表元*/ h->no=1;for(i=2;i<=n;i++)/*形成其余的n-1 个表元*/{u->link=(struct ele *)malloc(sizeof(struct ele));u=u->link;u->no=i;/*第i 个表元置编号i*/}u->link=h;/*末表元后继首表元,形成环*/puts("\nThe numbers of who will quit the cycle in turn are:"); while(n){for(i=1;i<m;i++)/*掠过m-1 个表元*/u=u->link;p=u->link;/*p 指向第m 个表元*/u->link=p->link;/*第m 个表元从环中脱钩*/printf("%4d",p->no);free(p);/*释放第m 个表元占用的空间*/n--;}printf("\n\n Press any key to quit...\n");getch();}学生成绩管理程序/*学生成绩管理程序编制一个统计学生考试分数的管理程序。

c语言实现顺序表的增删查改逆置简单代码

c语言实现顺序表的增删查改逆置简单代码

c语言实现顺序表的增删查改逆置简单代码1. 顺序表的定义顺序表是一种线性表,其元素在内存中按顺序存储,每个元素占用连续的存储单元。

顺序表的特点是存取速度快,但插入和删除元素时需要移动大量的元素。

顺序表可以用结构体来表示,其定义如下:typedef struct_SeqList {int*data; // 指向数据元素的指针int size; // 顺序表的长度int capacity; // 顺序表的容量} SeqList;2. 顺序表的初始化顺序表的初始化需要分配内存空间来存放数据元素。

可以使用以下代码来初始化顺序表:SeqList*init_seq_list(int capacity) {SeqList*list= (SeqList*)malloc(sizeof(SeqList));if (list==NULL) {return NULL;}list->data= (int*)malloc(sizeof(int) *capacity);if (list->data==NULL) {free(list);return NULL;}list->size=0;list->capacity=capacity;return list;}3. 顺序表的插入在顺序表中插入元素需要移动后面的元素,以保证元素的顺序性。

可以使用以下代码在顺序表中插入元素:int insert_seq_list(SeqList*list, int index, int value) {if (index<0||index>list->size) {return-1;}if (list->size==list->capacity) {// 扩容顺序表int*new_data= (int*)realloc(list->data, sizeof(int) *list->capacity*2);if (new_data==NULL) {return-1;}list->data=new_data;list->capacity*=2;}// 移动后面的元素for (int i=list->size; i>index; i--) {list->data[i] =list->data[i-1];}// 插入元素list->data[index] =value;list->size++;return0;}4. 顺序表的删除从顺序表中删除元素需要移动后面的元素,以保证元素的顺序性。

C语言实现顺序表的基本操作(从键盘输入生成线性表,读txt文件生成线性表和数组生成线性表-。。。

C语言实现顺序表的基本操作(从键盘输入生成线性表,读txt文件生成线性表和数组生成线性表-。。。

C语⾔实现顺序表的基本操作(从键盘输⼊⽣成线性表,读txt⽂件⽣成线性表和数组⽣成线性表-。

经过三天的时间终于把顺序表的操作实现搞定了。

(主要是在测试部分停留了太长时间)1. 线性表顺序存储的概念:指的是在内存中⽤⼀段地址连续的存储单元依次存储线性表中的元素。

2. 采⽤的实现⽅式:⼀段地址连续的存储单元可以⽤固定数组或者动态存储结构来实现,这⾥采⽤动态分配存储结构。

3. 顺序表结构体⽰意图三种写法完整代码:第⼀种写法. 从键盘输⼊⽣成线性表--完整代码如下,取值操作实际上就是删除操作的部分实现,这⾥就不写了#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int Status;typedef int ElemType;typedef struct SqList{ElemType *elem;int length;int listsize;}SqList;Status InitList(SqList &L){L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));if (!L.elem){printf("ERROR\n");return ERROR;}L.length = 0;L.listsize = LIST_INIT_SIZE;return OK;}Status ListEmpty(SqList L) //判空{if (L.length = 0) return TRUE;else return FALSE;}Status ListInsert(SqList &L, int i, ElemType e) //插⼊{ElemType *p, *q;ElemType *newbase;int j;if (i < 1 || i > L.length + 1) return ERROR;if (L.length >= L.listsize){newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));if (newbase == NULL){printf("realloc failed!\n");return ERROR;//exit(-1);}L.elem = newbase;L.listsize += LISTINCREMENT;}p = L.elem+i-1;for( q = L.elem + L.length - 1; q>= p; --q ){*(q+1) = *q;}*p = e;++L.length;return OK;}Status CrtList(SqList &L) // 从键盘输⼊数据⽣成线性表{printf("输⼊整数,以0结束:\n");ElemType e;int i = 1;scanf("%d", &e);while (e != 0){if (!ListInsert(L, i, e)) return ERROR;i++;scanf("%d", &e);}return OK;}Status CrtList2(SqList &L, ElemType d[], int n) // 从数组⽣成线性表{int i;for (i = 0; i < n; ++i){if (!ListInsert(L, i + 1, d[i])) return ERROR;}return OK;}Status ListDelet(SqList &L, int i, ElemType &e) //删除{if ((i<1) || (i>L.length)) return ERROR;ElemType *p, *q;p = &(L.elem[i - 1]);e = *p;q = L.elem + L.length - 1;for (++p; p <= q; ++p) *(p - 1) = *(p);--L.length;return OK;}Status GetElem(SqList &L, int i, ElemType &e) //取值{if ((i <= 0) || (i>L.length)) return ERROR;else{e = L.elem[i - 1];return OK;}}Status compare(ElemType a, ElemType b) //⽐较{if (a == b) return TRUE;else return FALSE;}int LocateElem(SqList L, ElemType e) //定位{Status compare(ElemType a, ElemType b);int i;for (i = 0; i<L.length; i++){if (compare(L.elem[i], e))return ++i;}if (i == L.length) return0;}Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e) //求直接前驱{int LocateElem(SqList L, ElemType e);int i = LocateElem(L, cur_e);if ((i == 0) || (i == 1)) return ERROR;pre_e = L.elem[i - 2];return OK;}int ListLength(SqList L) //求长度{int length = L.length;return length;}void MergeList(SqList La, SqList Lb, SqList &Lc) //归并{Lc.length = La.length + Lb.length;Lc.listsize = Lc.length;Lc.elem = (ElemType*)malloc(Lc.length*sizeof(ElemType));if (Lc.elem == NULL) exit(OVERFLOW);int i, j, k;for (i = 0, j = 0, k = 0; (i<La.length) && (j<Lb.length); k++){if (La.elem[i]<Lb.elem[j]){Lc.elem[k] = La.elem[i];i++;}else{Lc.elem[k] = La.elem[j];j++;}}while (i<La.length){Lc.elem[k] = La.elem[i];i++;k++;}while (j<Lb.length){Lc.elem[k] = Lb.elem[j];j++;k++;}}void vist(ElemType e){printf("%d ", e);}Status ListTraverse(SqList L) //遍历{int i;if (L.length == 0) printf("⽆元素");for (i = 0; i<L.length; i++){vist(L.elem[i]);}if (i == L.length){printf("\n");return OK;}else return ERROR;}Status ListClear(SqList L) //清空{if (L.elem == NULL) return ERROR;int i;for (i = 0; i<L.length; i++) L.elem[i] = 0;L.length = 0;return OK;}Status DestroyList(SqList &L) //销毁{if (L.elem == NULL) return ERROR;free(L.elem);L.length = 0;L.listsize = 0;return OK;}void PrnList(SqList L) //打印{int i;for (i = 0; i < L.length; ++i){printf("%5d", L.elem[i]);}printf("\n");}int main(){int j, l;ElemType e, e1;SqList La;if (InitList(La)) printf("OK\n");else exit(INFEASIBLE);CrtList(La);PrnList(La);int k;printf("1:判空\n2:插⼊\n3:删除\n4:定位\n5:求长度\n6:直接前驱\n");printf("7:归并\n8:遍历\n9:清空\n10:销毁\n\n0:退出\n");scanf("%d", &k);while (k != 0){switch (k){case1:if (ListEmpty(La)) printf("empty\n");else printf("non-empty\n");break;case2:printf("在第⼏个位置插⼊何数:");scanf("%d%d", &j, &e);if (ListInsert(La, j, e)) printf("OK\n");else printf("ERROR\n");break;case3:printf("删除第⼏个数:");scanf("%d", &j);if (ListDelet(La, j, e))PrnList(La);printf("删除数为:%d\n", e);break;case4:printf("定位数字:");scanf("%d", &e);if (LocateElem(La, e) != 0) printf("OK,位序为:%d\n", LocateElem(La, e));else printf("ERROR\n");break;case5:l = ListLength(La);printf("ListLength=%d\n", l);break;case6:printf("寻找何数直接前驱:");scanf("%d", &e);if (PriorElem(La, e, e1)) printf("前驱为:%d\n", e1);else printf("ERROR\n");break;case7:SqList Lb, Lc;if (InitList(Lb)) printf("OK\n");else printf("ERROR\n");CrtList(Lb);MergeList(La, Lb, Lc);printf("有序归并后:\n");PrnList(Lc);break;case8:if (ListTraverse(La)) printf("遍历成功\n");else printf("遍历失败\n");break;case9:if (ListClear(La)) printf("清空成功\n");else printf("清空失败\n");break;case10:if (DestroyList(La)) printf("销毁完成\n");else printf("销毁失败\n");return0;default:printf("ERROR\n");}scanf("%d", &k);}return0;}View Code第⼆种写法. 从txt⽂件读⼊⽣成线性表--完整代码如下:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0#define INIT_LIST_SIZE 100#define LISTINCREMENT 10typedef int Status;typedef int ElemType;typedef struct{ElemType *elem;int length;int listsize;}SqList;Status InitList(SqList *L){L->elem = (ElemType*)malloc(INIT_LIST_SIZE*sizeof(ElemType));if (!L->elem) exit(OVERFLOW);L->length = 0;L->listsize = INIT_LIST_SIZE;return OK;}Status ListEmpty(SqList L) //判空{if (L.length = 0) return TRUE;else return FALSE;}Status ListInsert(SqList *L, int i, ElemType e) //插⼊{ElemType *newbase, *q, *p;if (i<1 || i>L->length + 1) return ERROR;if (L->length>L->listsize){newbase = (ElemType*)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(ElemType));if (!newbase) exit(OVERFLOW);L->elem = newbase;L->listsize += LISTINCREMENT;}q = L->elem + i - 1; //q为插⼊位置for (p = L->elem + L->length - 1; p >= q; p--){*(p + 1) = *p;}*q = e;++L->length;return OK;}Status ListDelete(SqList *L, int i, ElemType * e) //删除{ElemType * p, *q;if (i<1 || i>L->length) return ERROR;p = L->elem + i - 1; //p为被删除元素位置*e = *p; //被删除元素的值赋值给eq = L->elem + L->length - 1; //表尾元素位置for (++p; p <= q; ++p){*(p - 1) = *p;}L->length--;return OK;}Status GetElem(SqList *L, int i, ElemType * e) //取值{if (i<1 || i>L->length) return ERROR;*e = *(L->elem + i - 1); //获取第i个元素的地址return OK;}int LocateElem(SqList L, ElemType e) //定位{int i;for (i = 0; i<L.length; i++){if (L.elem[i]==e)return ++i;}if (i == L.length) return0;}Status PriorElem(SqList L, ElemType e, ElemType &pre_e) //求直接前驱{int LocateElem(SqList L, ElemType e);int i = LocateElem(L, e);if ((i == 0) || (i == 1)) return ERROR;pre_e = L.elem[i - 2];return OK;}Status GetLength(SqList *L) //求长度{return L->length;}void PrnList(SqList *L) //遍历{int i;for (i = 0; i<(*L).length; i++){if (i == 0)printf("(");printf(" %d ", L->elem[i]);if (i == (*L).length - 1)printf(")\n");}}Status ClearList(SqList *L) //清空{L->length = 0;return OK;}Status Destroy(SqList *L) //销毁{free(L->elem);L->elem = NULL;L->length = 0;L->listsize = 0;return OK;}int main(){int n = 0, rc;int a, i;int e, e1;SqList L;if (InitList(&L)) printf("OK\n");FILE *fp = fopen("D:/1.txt", "r");if (fp == NULL){printf("打开⽂件失败");}printf("从1.txt⽂件读⼊⼏个数:");scanf("%d", &n);for (i = 0; i< n; i++){fscanf(fp, "%d", &a);ListInsert(&L, i+1, a);}fclose(fp);PrnList(&L);char k;printf("\n1.插⼊\n2.删除\n3.取值\n4.定位\n5.直接前驱\n6.求长度\n7.遍历\n8.清空\n9.销毁\n"); while (1){k = getchar();switch (k){case'1':printf("在第⼏个位置插⼊何数:");scanf("%d%d", &i, &e);if (ListInsert(&L, i, e))printf("i=%d,e=%d 已经插⼊\n", i, e);else printf("插⼊失败\n");break;case'2':printf("删除第⼏个数:\n");scanf("%d", &i);if (ListDelete(&L, i, &e))printf("i=%d,e=%d 已经删除\n", i, e);else printf("删除失败\n");break;case'3':printf("取第⼏个数:\n");scanf("%d", &i);if (GetElem(&L, i, &e))printf("第i=%d号,e=%d 被取出!\n", i, e);else printf("取值失败\n");break;case'4':printf("定位数字:");scanf("%d", &e);if (LocateElem(L, e) != 0) printf("OK,位序为:%d\n", LocateElem(L, e));else printf("ERROR\n");break;case'5':printf("寻找何数直接前驱:");scanf("%d", &e);if (PriorElem(L, e, e1)) printf("前驱为:%d\n", e1);else printf("ERROR\n");break;case'6':printf("表长为%d\n", GetLength(&L));break;case'7':printf("遍历:\n");PrnList(&L);break;case'8':if (ClearList(&L)) printf("清空成功\n");else printf("清空失败\n");break;case'9':printf("销毁\n");Destroy(&L);printf("销毁成功\n");exit(0);return0;}}return0;}View Code第三种写法:读数组⽣成线性表--完整代码如下:#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0#define INIT_LIST_SIZE 100#define LISTINCREMENT 10typedef int Status;typedef int ElemType;typedef struct{ElemType *elem;int length;int listsize;}Sqlist;Status InitList(Sqlist *L){L->elem = (ElemType *)malloc(INIT_LIST_SIZE *sizeof(ElemType));if (!L->elem)exit(OVERFLOW);L->length = 0;L->listsize = INIT_LIST_SIZE;return OK;}Status ListEmpty(Sqlist L){if (L.length = 0)return ERROR;else return FALSE;}Status ListInsert(Sqlist *L, int i, ElemType e){ElemType *newbase, *p, *q;if (i<1 || i>L->length + 1)return ERROR;if (L->length > L->listsize){newbase = (ElemType *)realloc(L, (L->listsize + LISTINCREMENT)*sizeof(ElemType));if (!newbase)exit(OVERFLOW);L->elem = newbase;L->listsize += LISTINCREMENT;}p = L->elem + i - 1;for (q = L->elem + L->length - 1; q >= p; q--){*(q + 1) = *q;}*p = e;L->length++;return OK;}Status CreateList(Sqlist *L, ElemType element[], int n) // 从数组⽣成线性表{int i;for (i = 0; i < n; ++i){if (!ListInsert(L, i + 1, element[i])) return ERROR;}return OK;}Status ListDelete(Sqlist *L, int i, ElemType *e){ElemType *p, *q;if (i<1 || i>L->length)return ERROR;p = L->elem + i - 1;q = L->elem + L->length - 1;*e = *p;for (p++; q >= p; p++){*(p - 1) = *p;}L->length--;return OK;}Status GetElem(Sqlist *L, int i, ElemType *e){if (i<1 || i>L->length)return ERROR;return OK;}int LocateElem(Sqlist L, ElemType e){int i;for (i = 0; i < L.length; i++)if (L.elem[i] == e)return i + 1;}Status PriorElem(Sqlist L, ElemType e, ElemType &pr_e){int LocateElem(Sqlist L, ElemType e);int i = LocateElem(L, e);if (i<1 || i>L.length)return ERROR;pr_e = L.elem[i - 2];return OK;}Status GetLength(Sqlist *L){return L->length;}void PrnList(Sqlist *L){int i;for (i = 0; i < L->length; i++)printf("%d ", L->elem[i]);printf("\n");}Status ClearList(Sqlist *L){L->length = 0;return OK;}Status Destroy(Sqlist *L){free(L->elem);L->elem = NULL;L->length = 0;L->listsize = 0;return OK;}int main(){int i;int a, n = 0;int e, e1;Sqlist L;ElemType element[] = { 15, 3, 59, 27, 8, 11, 32 };if (InitList(&L))printf("OK\n");CreateList(&L, element, 7);PrnList(&L);char k;printf("\n1.插⼊\n2.删除\n3.取值\n4.定位\n5.直接前驱\n6.求长度\n7.遍历\n8.清空\n9.销毁\n"); while (1){k = getchar();switch (k){case'1':printf("在第⼏个位置插⼊何数:");scanf("%d%d", &i, &e);if (ListInsert(&L, i, e))printf("i=%d e=%d已经插⼊\n", i, e);break;case'2':printf("删除第⼏个数:");scanf("%d", &i);if (ListDelete(&L, i, &e))printf("i=%d e=%d已经删除\n", i, e);break;case'3':printf("取第⼏个数:");scanf("%d", &i);if (GetElem(&L, i, &e))printf("第i=%d e=%d已经取出\n", i, e);break;case'4':printf("定位何数:");scanf("%d", &e);if (LocateElem(L, e))printf("位序为:%d\n", LocateElem(L, e));break;case'5':printf("寻找何数的直接前驱:");scanf("%d", &e);if (PriorElem(L, e, e1))printf("前驱为:%d\n", e1);break;case'6':printf("表长为:%d\n", GetLength(&L));break;case'7':printf("遍历:\n");PrnList(&L);break;case'8':if (ClearList(&L))printf("清空成功!\n");break;case'9':if (Destroy(&L))printf("销毁成功!\n");exit(0);return0;}}return0;}View Code看懂了左⼿给你个栗⼦,给我关注点赞;看不懂右⼿给你个锤⼦,砸开脑壳看看有没有带脑⼦。

数据结构实验报告(C语言)顺序表__排序

数据结构实验报告(C语言)顺序表__排序
//冒泡排序 void BubbleSort(SqeList *L){
int i,j,n,x,change; n=L->length; change=1; for(i=1;i<=n-1 && change;++i){
change=0; for(j=1;j<=n-i-1;++j)
if(L->r[j] > L->r[j+1]){ x=L->r[j]; L->r[j]=L->r[j+1]; L->r[j+1]=x; change=1;
void QuickSort(SqeList *L,int low,int high){ int mid; if(low<high){ mid=Partition(L,low,high); QuickSort(L,low,mid-1); QuickSort(L,mid+1,high); }
}
//直接选择排序
printf("\n7-直接选择排序结果为:\n"); SelectSort(&l); PrintList(&l); printf("\n"); printf("\n8-二路归并结果为:\n"); MergeSort(&l);
PrintList(&l); printf("\n"); } else printf("请输入大于 0 的值: "); return 0; }
} else{
MR->r[k]=R->r[j]; ++j; } ++k; } while(i<=mid) MR->r[k++]=R->r[i++]; while(j<=high) MR->r[k++]=R->r[j++]; }

C语言顺序表的简单实现

C语言顺序表的简单实现

C语⾔顺序表的简单实现今天刚学了,⽼师教的我是云⾥雾⾥的,晚上回来⾃⼰⼜教程视频,不管怎么说算是简单的实现了顺序表的⼀些简单功能。

顺序表⾥的难点有向顺序表⾥插⼊元素,删除元素,查询元素位置这⼏个函数⽐较难写,我⾃⼰根据这⼏个难点做了⼏个图⽚来解释这⼏个功能的具体实现:插⼊元素的实现:其实数据结构与算法中的顺序表的原理跟数组是⼀样的。

当你在往⼀个数组中插⼊⼀个元素时,为了避免插⼊的位置的原有数据被覆盖我们就需要发数组中从插⼊位置开始的数据统⼀往后移⼀个位置,然后再把需要插⼊的数据插⼊此时的表中,这样就可以保证数据不会丢失,并且每插⼊⼀个数据我们的表的长度就加1。

1//插⼊元素2int InsertList(sqlink L,int data,int no){3int j;4if(L->last >= maxsize-1){5 printf("没有空闲空间!\n");6return0;7 }else if(no<0||no>L->last+1){8 printf("插⼊位置不存在!\n");9return0;10 }else{11for(j=L->last;j>=no-1;j--)12 L->data[j+1] = L->data[j];13 L->data[no-1] = data;14 L->last++;15return0;16 }17 }删除元素的实现:相对于插⼊元素,删除元素不需要进⾏数据的插⼊,我们想要删除某⼀个位置的数据只需要把此位置的数据覆盖了就⾏了,也就是说把需要删除的位置的后继元素都往前移⼀个位置,把需要删除的位置的数据覆盖的。

1//删除元素2int DeleteList(sqlink L,int no){3int j;4if(no<0||no>L->last){5 printf("删除的元素不存在");6return0;7 }else{8for(j=no;j+1<=L->last;j++)9 L->data[j] = L->data[j+1];10 L->last--;11return0;12 }13 }定位元素的实现:定位元素的思想很简单,跟数组的遍历时⼀样的。

C#数据结构之顺序表(SeqList)实例详解

C#数据结构之顺序表(SeqList)实例详解

C#数据结构之顺序表(SeqList)实例详解本⽂实例讲述了C#数据结构之顺序表(SeqList)实现⽅法。

分享给⼤家供⼤家参考,具体如下:线性结构(Linear Stucture)是数据结构(Data Structure)中最基本的结构,其特征⽤图形表⽰如下:即:每个元素前⾯有且只有⼀个元素(称为“前驱”),同样后⾯有且只有⼀个元素(称为"后继")--注:起始元素的前驱认为是空,末尾元素的后继认为也是空,这样在概念上就不冲突了。

线性表(List)是线性结构的⼀种典型实现,它⼜可以分为:顺序表(SeqList)和链表(LinkList)⼆⼤类.顺序表(SeqList)的基本特征为:元素在内部存储时是⼀个接⼀个在存储单元中按顺序存储的,所以只要知道"起始元素的存储地址"--称为顺序表的基地址(Base Address)以及顺序表中任何元素的位置(即它是第⼏个元素),就能直接定位到该元素的地址,从⽽直接访问到该元素的值。

也就是说存储/读取每个元素所⽤的时间是相同的,即所谓的“随机存取”C#语⾔中数组(Array)在内存中占⽤的就是⼀组连续的存储区域,所以⽤数组来实现顺序表再适⽤不过。

先来定义线性表的通⽤接⼝IListDS.cs(注:DS为DataStructure的缩写)namespace 线性表{public interface IListDS<T>{//取得线性表的实际元素个数int Count();//清空线性表void Clear();//判断线性表是否为空bool IsEmpty();//(在末端)追加元素void Append(T item);//在位置i“前⾯”插⼊元素itemvoid InsertBefore(T item, int i);//在位置i“后⾯”插⼊元素itemvoid InsertAfter(T item, int i);//删除索引i处的元素T RemoveAt(int i);//获得索引位置i处的元素T GetItemAt(int i);//返回元素value的索引int IndexOf(T value);//反转线性表的所有元素void Reverse();}}顺序表(SeqList)的实现:using System;using System.Text;namespace 线性表{/// <summary>/// 顺序表/// </summary>/// <typeparam name="T"></typeparam>public class SeqList<T> : IListDS<T>{private int maxsize;private T[] data;private int last;//类索引器public T this[int index]{get{return this.GetItemAt(index);}set{if (index < 0 || index > last + 1)Console.WriteLine("Position is error");return;}data[index] = value;}}//最后⼀个元素的下标public int Last{get { return last; }}//最⼤容量public int Maxsize{get { return this.maxsize; }set { this.maxsize = value; }}//构造函数public SeqList(int size){data = new T[size];maxsize = size;last = -1;}//返回链表的实际长度public int Count(){return last + 1;}//清空public void Clear(){last = -1;}//是否空public bool IsEmpty(){return last == -1;}//是否满public bool IsFull(){return last == maxsize - 1;}//(在最后位置)追加元素public void Append(T item){if (IsFull()){Console.WriteLine("List is full");return;}data[++last] = item;}/// <summary>///前插/// </summary>/// <param name="item">要插⼊的元素</param> /// <param name="i">要插⼊的位置索引</param> public void InsertBefore(T item, int i){if (IsFull()){Console.WriteLine("List is full");return;}if (i < 0 || i > last + 1){Console.WriteLine("Position is error");return;}if (i == last + 1){data[last + 1] = item;}{//位置i及i以后的元素,全部后移for (int j = last; j >= i; j--){data[j + 1] = data[j];}data[i] = item;}++last;}/// <summary>/// 后插/// </summary>/// <param name="item"></param>/// <param name="i"></param>public void InsertAfter(T item, int i){if (IsFull()){Console.WriteLine("List is full");return;}if (i < 0 || i > last){Console.WriteLine("Position is error");return;}if (i == last){data[last + 1] = item;}else{//位置i以后的元素(不含位置i),全部后移for (int j = last; j > i; j--){data[j + 1] = data[j];}data[i+1] = item;}++last;}/// <summary>/// 删除元素/// </summary>/// <param name="i">要删除的元素索引</param> /// <returns></returns>public T RemoveAt(int i){T tmp = default(T);if (IsEmpty()){Console.WriteLine("List is empty");return tmp;}if (i < 0 || i > last){Console.WriteLine("Position is error!");return tmp;}if (i == last){tmp = data[last];}else{tmp = data[i];//位置i以及i以后的元素前移for (int j = i; j <= last; j++){data[j] = data[j + 1];}}--last;return tmp;}/// <summary>/// 获取第⼏个位置的元素/// </summary>/// <param name="i">第⼏个位置</param>/// <returns></returns>public T GetItemAt(int i){if (IsEmpty() || (i < 0) || (i > last)){Console.WriteLine("List is empty or Position is error!"); return default(T);}return data[i];}/// <summary>/// 定位元素的下标索引/// </summary>/// <param name="value"></param>/// <returns></returns>public int IndexOf(T value){if (IsEmpty()){Console.WriteLine("List is Empty!");return -1;}int i = 0;for (i = 0; i <= last; i++){if (value.Equals(data[i])){break;}}if (i > last){return -1;}return i;}/// <summary>/// 元素反转/// </summary>public void Reverse(){T tmp = default(T);for (int i = 0; i <= last / 2; i++){tmp = data[i];data[i] = data[last-i];data[last-i] = tmp;}}public override string ToString(){StringBuilder sb = new StringBuilder();for (int i = 0; i <= last; i++){sb.Append(data[i].ToString() + ",");}return sb.ToString().TrimEnd(',');}}}测试代码⽚段:Console.WriteLine("顺序表测试开始...");SeqList<string> seq = new SeqList<string>(10);seq.Append("x");seq.InsertBefore("w", 0);seq.InsertBefore("v", 0);seq.Append("y");seq.InsertBefore("z", seq.Count());Console.WriteLine(seq.Count());//5Console.WriteLine(seq.ToString());//v,w,x,y,zConsole.WriteLine(seq[1]);//wConsole.WriteLine(seq[0]);//vConsole.WriteLine(seq[4]);//zConsole.WriteLine(seq.IndexOf("z"));//4Console.WriteLine(seq.RemoveAt(2));//xConsole.WriteLine(seq.ToString());//v,w,y,zseq.InsertBefore("x", 2);Console.WriteLine(seq.ToString());//v,w,x,y,zConsole.WriteLine(seq.GetItemAt(2));//xseq.Reverse();Console.WriteLine(seq.ToString());//z,y,x,w,vseq.InsertAfter("z_1", 0);seq.InsertAfter("y_1", 2);seq.InsertAfter("v_1", seq.Count()-1);Console.WriteLine(seq.ToString());//z,z_1,y,y_1,x,w,v,v_1顺序表的优点:读取元素时可直接定位,所以在某些操作(⽐如将顺序表元素反转合围)中,不需要完全遍历,循环次数(即时间复杂度)相对完全遍历⽽⾔能减少⼀半。

c语言排序与查找代码

c语言排序与查找代码

c语言排序与查找代码在程序设计中,排序和查找是非常常见的操作。

排序是将一组数据按照特定规则进行重新排列的过程,而查找则是在已经排列好的数据中寻找某个特定的元素。

C语言提供了丰富的函数和算法来实现这两个操作。

一、排序代码实现:C语言中有多种排序算法可以选择,其中最常见和经典的有冒泡排序、选择排序、插入排序和快速排序等。

1. 冒泡排序代码实现:冒泡排序是一种简单直观的排序算法,它通过不断交换相邻元素的位置,将较大的元素逐渐往后移动。

具体实现代码如下:```cvoid bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}```2. 选择排序代码实现:选择排序是一种简单的排序算法,它每次从待排序的数据中选出最小(或最大)的元素,放到已排序序列的末尾。

具体实现代码如下:```cvoid selectionSort(int arr[], int n) {int i, j, minIndex, temp;for (i = 0; i < n - 1; i++) {minIndex = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}```3. 插入排序代码实现:插入排序是一种简单直观的排序算法,它将待排序的数据分为已排序和未排序两部分,每次从未排序部分取出一个元素插入到已排序部分的适当位置。

c语言的优先级顺序表

c语言的优先级顺序表

c语言的优先级顺序表
C语言的运算符优先级顺序如下:
1. 括号(Parentheses)
2. 一元运算符(Unary Operators)
3. 乘法运算符*、除法运算符/、求余运算符%
4. 加法运算符+、减法运算符-
5. 移位运算符<<、>>
6. 大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=
7. 等于运算符==、不等于运算符!=
8. 按位与运算符&
9. 按位异或运算符^
10. 按位或运算符|
11. 逻辑与运算符&&
12. 逻辑或运算符||
13. 三目条件运算符? :
14. 赋值运算符=、+=、-=、*=、/= 等
15. 逗号运算符,
注意:尽管这个顺序大致上是对的,但是不同的编译器可能会有些许的差异,所以建议在编写代码时始终使用括号来明确优先级。

实验一数据结构顺序表的插入和删除

实验一数据结构顺序表的插入和删除

实验一顺序表的操作1.实验题目:顺序表的操作2.实验目的和要求:1)了解顺序表的基本概念、顺序表结构的定义及在顺序表上的基本操作(插入、删除、查找以及线性表合并)。

2) 通过在Turbo C(WinTc,或visual stdio6)实现以上操作的C语言代码。

3)提前了解实验相关的知识(尤其是C语言)。

3.实验内容:(二选一)1) 顺序表的插入算法,删除算法,顺序表的合并算法2) 与线性表应用相关的实例(自己选择具体实例)4.部分参考实验代码:⑴顺序表结构的定义:#include <stdio.h>#define MAXLEN 255typedef int ElemType;typedef struct{ ElemType elem[MAXLEN];int length;}sqList;⑵顺序表前插(在第i号元素前插入一个新的元素)int ListInsert(sqList *la,int i,int x){ int j;if(i<0||i>la-> length +1){ printf(“\n the value of i is wrong!”);return 0;}if(la-> length +1>=MAXLEN){ printf(“\n overflow!”);return 0;}. for(j=la-> length;j>=i;j--)la->list[j+1]=la->list[j];la->list[i]=x;la-> length ++;return 1;}⑶顺序表删除int ListDelete(sqList *la,int i){ if(i<0||i>la-> length){ printf(“\n the position is wrong!\n”);return 0;}for(i;i<la-> length;i++)la->list[i-1]=la->list[i];la-> length --;return 1;}5.附录:实验预备知识:⑴复习C语言中数组的用法。

c语言初学必背代码

c语言初学必背代码

c语言初学必背代码C 语言作为一门基础的编程语言,对于初学者来说,掌握一些关键的代码片段是非常重要的。

这些代码不仅能够帮助我们理解 C 语言的基本语法和编程思想,还能为后续更复杂的程序编写打下坚实的基础。

接下来,就让我们一起看看 C 语言初学必背的那些代码。

首先,是简单的“Hello World”程序。

这几乎是每一个学习编程语言的人所接触的第一个程序。

```cinclude <stdioh>int main(){printf("Hello World!\n");return 0;}```在这个程序中,`include <stdioh>`是预处理指令,用于包含标准输入输出头文件。

`int main()`是主函数,是 C 语言程序的入口点。

`printf`函数用于在屏幕上输出指定的文本。

`\n`是换行符,用于在输出文本后换行。

接下来,是变量的声明和使用。

```cinclude <stdioh>int main(){int num = 10; //声明并初始化一个整型变量float price = 999; //声明并初始化一个浮点型变量char letter ='A';//声明并初始化一个字符型变量printf("整数: %d\n", num);printf("浮点数: %f\n", price);printf("字符: %c\n", letter);return 0;}```在上述代码中,我们看到了不同数据类型变量的声明和初始化,以及如何使用`printf`函数输出这些变量的值。

再看条件判断语句,比如`ifelse`语句。

```cinclude <stdioh>int main(){int num = 5;if (num > 10) {printf("数字大于 10\n");} else {printf("数字小于或等于 10\n");}return 0;}```通过`ifelse`语句,我们可以根据不同的条件执行不同的代码块。

C语言顺序表基本函数

C语言顺序表基本函数
{
if(L->data[i]==x)
return i;
i++;
}
printf("顺序表中不存在此数据!\n");
return -2;
if(!(*L).elem) return OVERFLOW;
(*L).length=LIST_SEQLIST_INIT_SIZE;
(*L).last=0;
return OK;
}
int Initlist_Seqlist_2(Seqlist *L)
/*初始化链表:1.先决条件:初始化结构体数据;2.函数作用:删除已有链表,
break;
case 2:printf("请输入数据:");
scanf("%d",&e);
status=Increase_Seqlist(&L,e);
if(status==OK)
printf("成功增加数据!\n");
else if(status==OVERFLOW)
printf("申请空间失败,所有数据丢失!\n");
scanf("%d%d",&i,&k);
getchar();
if(i<1||i>(*L).last)
{
printf("删除起点越界!\n");
return ERROR;
}
if(k<0)
{
printf("删除个数有误!\n");
return ERROR;
}
if(i+k-1>(*L).last)
{

用c语言完成顺序表的初始化和创建例子

用c语言完成顺序表的初始化和创建例子

用c语言完成顺序表的初始化和创建例子顺序表是一种线性数据结构,通常用数组实现。

在使用前,需要对其进行初始化和创建。

下面是用c语言完成顺序表的初始化和创建的例子:
1. 初始化
顺序表初始化包括两个步骤:分配内存空间和将各个元素初始化为空。

```
#define MAXSIZE 100 // 定义顺序表的最大长度
typedef struct{
int data[MAXSIZE]; // 存储元素的数组
int length; // 顺序表当前长度
} SqList;
// 初始化顺序表
void InitList(SqList *L){
L->length = 0; // 初始长度为0
}
```
2. 创建
顺序表创建需要输入元素数据,创建过程中需要将元素逐个插入到顺序表中。

```
// 创建顺序表
void CreateList(SqList *L){
int i, n;
printf('请输入元素个数:');
scanf('%d', &n);
printf('请输入%d个元素:
', n);
for(i = 0; i < n; i++){
scanf('%d', &L->data[i]); // 逐个输入元素
L->length++; // 顺序表长度加1
}
}
```
以上就是用c语言完成顺序表的初始化和创建的例子。

通过这个例子,我们可以了解到顺序表的基本操作,并能够在实际编程中运用。

顺序表的查找完整实现代码

顺序表的查找完整实现代码
int i =1;
fa.write((char *)&ST.length,4);
while(i<=ST.length){
stu[i].key = 1000+i;
stu[i].math = rand()%100;
stu[i].english = rand()%100;
fa.write((char *)&ST.elem[i],12);
typedef int keyType;
typedef struct {
int key;
float info;
}sTable;
int seq_search(sTable ST[],int n,int key)
{
ST[0].key = key;
int i = n;
while(ST[i].key!=key)
else
high = mid-1;
}
return 0;
}
void getData(STable *t)
{
char *fp = ".\\stu.dat";
int i=1;
fstream ff(fp,ios::in|ios::trunc);
ff.read((char *)&(t->length),4);
#include<iostream>
#include<time.h>
#include<iomanip>
#include<fstream>
using namespace std;
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b) )

c语言顺序表实现完整版

c语言顺序表实现完整版

#include <stdio.h>#include<stdlib.h>#include<malloc.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef int Elemtype;typedef int Status;typedef struct{Elemtype *elem;int length;int listsize;}SqList; //定义顺序表类型Status InitList_Sq(SqList &L) //初始化顺序表{L.elem=(Elemtype *)malloc(LIST_INIT_SIZE* sizeof(Elemtype)); L.length=0;L.listsize=LIST_INIT_SIZE;return 1;}void CreateList(SqList &L) //创建顺序表{int i;printf("请输入你要创建的顺序表元素个数");scanf("%d",&L.length);printf("请输入你要创建的顺序表:\n");for(i=0;i<L.length;i++)scanf("%d",&L.elem[i]);}void print( SqList &L)//输出顺序表{int i;for(i=0;i<L.length;i++)printf("%3d",L.elem[i]);}Status location( SqList L,Elemtype e)//查找元素的位置{int i=0;while(L.elem[i]!=e && i<L.length)i++;if(i>L.length)return -1;elsereturn i+1;//因为c语言是从下标0开始的当i=0时实际上是顺序表的第i+1个元素}Status ListInsert_Sq(SqList &L,int i,Elemtype e)//在顺序表的第i个位置插入值为e的元素{Elemtype *newbase,*q,*p;if(i<1||i>L.length+1)return 0;if(L.length>=L.listsize){newbase=(Elemtype *)realloc(L.elem,(L.listsize+LISTINCREMENT)* sizeof(Elemtype));L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return 1;}Status ListDelect_Sq(SqList &L,int i,Elemtype e)//在顺序表的第i个位置删除值为e的元素并返回e的值{Elemtype *q,*p;if(i<1||(i>L.length))return 0;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p)*(p-1)=*p;--L.length;return 1;}void Combine(SqList La,SqList Lb,SqList &Lc)//将两个非递减的顺序表合并成一个顺序表,合并后元素也按值非递减排列{Elemtype *pa_last,*pb_last,*pa,*pb,*pc;pa=La.elem;pb=Lb.elem;Lc.listsize=Lc.length=La.length+Lb.length;pc= Lc.elem=(Elemtype *)malloc(Lc.listsize* sizeof(Elemtype)); pa_last=La.elem+La.length-1;pb_last=Lb.elem+Lb.length-1;while(pa<=pa_last && pb<=pb_last){if(*pa<= *pb)*pc++=*pa++;else*pc++=*pb++;}while(pa<=pa_last)*pc++=*pa++;while(pb<=pb_last)*pc++=*pb++;}void main(){SqList la,lb,lc,ld;int i,j;Elemtype e;InitList_Sq(la);CreateList(la);print(la);printf("请输入要查找的元素:\n");scanf("%d",&e);j=location(la,e);printf("该元素的位置为%d\n",j);printf("请输入要插入的位置和元素:\n");scanf("%d%d",&i,&e);ListInsert_Sq(la,i,e);printf("输出插入后的顺序表:\n"); print(la);printf("请输入要删除的位置:\n"); scanf("%d",&i);ListDelect_Sq(la,i,e);printf("删除的那个元素是:%d\n",e); printf("输出删除后的顺序表:\n"); print(la);InitList_Sq(lb);CreateList(lb);print(lb);InitList_Sq(lc);CreateList(lc);print(lc);InitList_Sq(ld);Combine(lb,lc,ld);printf("合并后的顺序表为:\n"); print(ld);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//----------------------------线性表的动态分配顺序存储结构-------------------------# include "stdio.h"# include "malloc.h"# include "stdlib.h"# define M 5 //线性表存储空间的初始分配量# define N 2 //线性表存储空间的分配增量typedef struct {int *elem; //存储空间基址int length; //当前长度int listsize; //当前分配的存储容量(以sizeof(int)为单位)}SqList;int InitList(SqList *L) { // 构造一个空的线性表LL->elem=(int *)malloc(M*sizeof(int));if(!L->elem) // 存储分配失败exit(-2);L->length=0; // 空表长度为0L->listsize=M; // 初始存储容量return 1;}int IntPut(SqList *L) { //输入数据int i,e;printf ("请输入你要输入数据的个数:\n");scanf ("%d",&e);if (1>e||5<e) { //判断输入数据的个数是否合格,若不合格请重新输入do{printf ("你输入的数据有误!请重新输入:\n");scanf ("%d",&e);}while(1>e||5<e);}printf ("输入正确!\n请开始输入数据并用空格隔开:\n");for (i=0;i<e;i++) { //开始输入数据scanf ("%d",&L->elem[i]);L->length=L->length+1;}return 1;}int OutPut(SqList *L) { //输出数据int i;for (i=0;i<L->length;i++) {printf ("%d",L->elem[i]);printf ("\n");}return 1;}int Find(SqList *L) { //在顺序线性表L中查找第i个值,若找到,则打印出对应的值int i;printf ("请输入你要查找的数据序号:\n");scanf ("%d",&i);if (1>i||L->length<i) { //判断输入的序号是否合格,若不合格请重新输入do{printf ("你输入的数据有误!请重新输入:\n");scanf ("%d",&i);}while(1>i||L->length<i);}printf ("输入的序号正确!\n你输入的序号所对应的数据是:\n");printf ("%d\n",L->elem[i-1]); //打印出对应的值return 0;}int ListInsert(SqList *L) { // 在顺序线性表L的第i个元素之前插入新的元素e,// i的合法值为1≤i≤ListLength(L)+1 int *y,*q,*p,i,e;printf ("请输入你要插入的数据序号:\n");scanf ("%d",&i);if (1>i||(L->length+1)<i) { // 判断输入的序号是否合格,若不合格请重新输入do{printf ("你输入的数据有误!请重新输入:\n");scanf ("%d",&i);}while(1>i||(L->length+1)<i);}printf ("输入的序号正确!\n请输入你要插入的数据:\n");scanf ("%d",&e);if(L->length>=L->listsize) { // 当前存储空间已满,增加容量y=(int *)realloc(L->elem,(L->listsize+N)*sizeof(int));if(!y) // 存储分配失败exit(-2);L->elem=y; // 新基址L->listsize+=N; // 增加存储容量}q=&(L->elem[i-1]); // q为插入位置for(p=&(L->elem[L->length-1]);p>=q;--p) // 插入位置及之后的元素右移*(p+1)=*p;if(L->length>6){printf ("插入失败,线性表L已满!\n");return 1;}*q=e; // 插入e++L->length; // 表长增1return 1;}int ListDelete(SqList *L,int &e) { // 在顺序线性表L中删除第i个元素,并用e返回其值。

// i的合法值为1≤i≤ListLength(L) int *p,*q,i;printf ("请输入你要删除的数据序号:\n");scanf ("%d",&i);if (1>i||L->length<i) { // 判断输入的序号是否合格,若不合格请重新输入do{printf ("你输入的数据有误!请重新输入:\n");scanf ("%d",&i);}while(1>i||L->length<i);}printf ("输入的序号正确!\n");p=&(L->elem[i-1]); // p为被删除元素的位置e=*p; // 被删除元素的值赋给eq=L->elem+L->length-1; // 表尾元素的位置for(++p;p<=q;++p) // 被删除元素之后的元素左移*(p-1)=*p;--L->length; // 表长减1return 1;}void menu() { //菜单system("cls");printf ("\t|===========================================================|\t\n");printf ("\t| |\t\n");printf ("\t| 线性表的顺序表示与实现|\t\n");printf ("\t| |\t\n");printf ("\t|===========================================================|\t\n");printf ("\n\t 【1】建立线性表! \t\t\t【2】输入数据!\n");printf ("\n\t 【3】输出数据! \t\t\t【4】查找!\n");printf ("\n\t 【5】插入!\t\t\t\t【6】删除!\n");printf ("\n\t 【0】退出程序!\n");}int main () { //主函数int i,e;SqList L;system("color 9F");while(1) {menu();printf ("\n\n\t\t\t请输入的你的选择:"); //输入选择的功能序号scanf ("%d",&i);switch(i) {case 1: //建立线性表InitList(&L);printf ("构建一个空线性表完毕!\n");system("pause");break;case 2: //输入数据IntPut(&L);system("pause");break;case 3: //输出数据printf ("你输入的数据如下:\n");OutPut(&L);system("pause");break;case 4: //查找Find(&L);system("pause");break;case 5: //插入ListInsert(&L);printf ("你插入新数据后的结果如下:\n");OutPut(&L);system("pause");break;case 6: //删除ListDelete(&L,e);printf ("你删除的数据如下:\n");printf ("%d",e);printf ("\n你删除数据后的结果如下:\n");OutPut(&L);system("pause");break;default: //退出printf ("退出!\n");return 1;}}}。

相关文档
最新文档