数据结构(C语言)
线性表-顺序表
- 顺序表结构与功能的实现代码(C语言)
主要的用来记录自己输出的代码!!!!
//
// main.c
// C-text
//
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h> //使用bool的明
#define Max 10
//定义Max常量
//结构体
typedef struct{
int id;
char* book;
char* author;
int value;
}ElementType;
//线性表:元素(id、book、author、value)
typedef struct{
ElementType datas[Max];
int num;
}Library;
//整体定义:(线性表datas[]、num)
//函数声明
void createlist(Library* library ,ElementType* a , int num );//初始化线性表
bool listinsert(Library* library,int index,ElementType element );//插入元素
bool listdelete( Library* L,int i, ElementType* e);//删除元素
void displist( Library* library);//输出元素
void deslist(Library* library);//销毁线性表
int listlength(Library* L);//求线性表长度(书的种类num)
bool listempty(Library* L);//判空(是否有书)
void locatelem(Library* L ,char* e);//定位(通过书名,定位序号)
void getelem(Library* L,int i,ElementType* e );//通过序号获得书名
int main(void) {
ElementType a[]={{1,"复习全书","李永乐",50},{2,"辅导讲义","汤家凤",130},{3,"三十六讲","张宇",42}};
ElementType b={4,"秘笈","垃圾左",1};
ElementType e;
ElementType n;
char c[] ="复习全书";
Library library;
createlist(&library,a,sizeof(a)/sizeof(a[0]));
displist(&library);
listinsert(&library, 4, b);
displist(&library);
printf("被加入的书籍:\n书号%d 书名:%s 作者:%s 价值%d\n\n\n",b.id,b.book,
b.author,b.value);
listdelete(&library,4, &e);
displist(&library);
printf("被删除的书籍:\n书号%d 书名:%s 作者:%s 价值%d\n",e.id,e.book,
e.author,e.value);
locatelem(&library,c);
getelem(&library,2, &n );
}
void createlist(Library* library ,ElementType* datas , int num ){
if (num > Max)
{
printf("初始化长度大于数组总长度,初始化失败\n");
return;
}
library->num = 0;
for (int i = 0; i < num; i++)
{
listinsert(library, i+1, datas[i]); //向seqlist顺序表中的i下标位置插入Array数组中的第i个元素
}
}
void displist(Library* library){
for(int i=0;i< library->num ; i++){
printf("书号%d 书名:%s 作者:%s 价值%d\n",library->datas[i].id,library->datas[i].book,
library->datas[i].author,library->datas[i].value);
}
printf("------------------------------\n");
printf("书本种类数:%d\n",library->num);
printf("\n");
}
bool listinsert(Library* L,int i,ElementType e ){
int j;
if(i<1||i>L->num+1)
return false;
i--; /*变成物理下标*/
for(j=L->num;j>i;j--)
L->datas[j]=L->datas[j-1];
L->datas[j]=e;
L->num++;
return true;
}
bool listdelete(Library* L,int i, ElementType* e){
int j ;
if(i<1||i>L->num)
return false;
i--;
*e=L->datas[i]; //出错点 没有加上* 定义时为
for(j=i; j<L->num-1 ;j++)
L->datas[j] = L->datas[j+1];
L->num--;
return true;
}
void destroy(Library* L){
free(L);
}
bool listempty(Library* L){
return(L->num=0);
}
int listlength(Library *L){
return(L->num);
}
void getelem(Library *L,int i,ElementType* e ){
if(i<1||i>L->num)
printf("找不到!!!!!!");
else{
*e=L->datas[i-1];
printf("\nId是%i的书:书名%s 作者%s\n",i,e->book,e->author) ;
}
}
void locatelem(Library *L ,char a[]){
int i=0;
while(i<L->num &&strcmp(a,L->datas[i].book))
i++;
if (i>=L->num)
printf("没有找到!!!\n");
else {
printf("\n《%s》的书号是:%d\n",L->datas[i].book,L->datas[i].id);
}
//物理下标+1=逻辑下标
}
- 顺序表的实例
~ 反向输出数组
#include <stdio.h>
#define Maxsize 100
typedef struct {
int value;
}ElemType;
typedef struct {
ElemType data[Maxsize];
int length;
} sqlist;
void revrse(sqlist* L);
int main(){
sqlist sqlist;
int value[]={1,2,3,4,5,6};
for(int i=0;i<6;i++)
sqlist.data[i].value=value[i];
printf("原来是:\n");
for(int i=0;i<6;i++)
printf("%d ",sqlist.data[i].value);
printf("\n现在是:\n");
revrse(&sqlist);
}
void revrse(sqlist* L){
int e;
L->length=6;
for(int i=0;i<L->length/2;i++){
e=L->data[i].value;
L->data[i].value=L->data[L->length-i-1].value;
L->data[L->length-i-1].value=e;
}
for(int i=0;i<L->length;i++)
printf("%d ",L->data[i].value);
printf("\n");
}