数据结构(C语言实现)
来源:互联网 发布:软件开发过程控制程序 编辑:程序博客网 时间:2024/04/26 05:58
1.线性表的顺序存储
#include<stdio.h>#include<stdlib.h>#define MAX 20typedef int DataType ;typedef struct{ int length; DataType data[MAX];}SqList;int InitList(SqList *L){ //L=(SqList *)malloc(sizeof(SqList)); L->length=0; return 0;}int ListEmpty(SqList L){ if(L.length==0) return 1; else return 0;}int ClearList(SqList *L){ L->length=0; return 0;}int getData(SqList *L,int i,DataType *e){ if(L->length==0||i<1||i>L->length) return 0; else *e=L->data[i-1]; return 1;}int ListInsert(SqList *L,int i,DataType e){ int k; if(L->length==MAX) { // printf("顺序表已满\n"); return 0; } if(i<0||i>L->length+1) { //printf("插入位置不合法\n"); return 0; } else { for(k=L->length-1;k>=i-1;k--) L->data[k+1]=L->data[k]; } L->data[i-1]=e; L->length++; return 1;}int ListDelete(SqList *L,int i,DataType *e){ int k; if(i<1||i>L->length) return 0; //删除位置不正确 if(L->length==0) return 0; //空表 *e=L->data[i-1]; if(i<=L->length) { for(k=i;k<L->length;k++) L->data[k-1]=L->data[k]; } L->length--; return 0;}int ListTraverse(SqList L){ int i; for(i=0;i<=L.length-1;i++) { printf("%3d",L.data[i]); } printf("\n"); return 1;}int main(){ int i,j,k; SqList L; DataType e; i=InitList(&L); printf("初始化后表长:%d\n",L.length); for(j=1;j<=5;j++) i=ListInsert(&L,1,j); printf("表头插入数字1到5之后:"); ListTraverse(L); printf("插入五个数字后表长:%d\n",L.length); i=ListEmpty(L); printf("此时表是否为空(1代表是,0代表否):%d\n",i); i=ClearList(&L); printf("\n清空表后,表长为%d\n",L.length); printf("此时表是否为空(1代表是,0代表否):%d\n",i); for(j=1;j<=5;j++) i=ListInsert(&L,j,j); printf("表尾插入五个数字之后:"); ListTraverse(L); printf("插入五个数字后表长:%d\n",L.length); getData(&L,3,&e); printf("第三个数字是:%d\n",e); i=ListDelete(&L,2,&e); printf("删除第2个数据后为:"); ListTraverse(L); printf("被删除的数字是:%d\n",e); i=L.length; printf("输入想要删除的数据的序号:"); scanf("%d",&k); if(k>i||k<=0) printf("删除位置不正确\n"); else { i=ListDelete(&L,k,&e); printf("删除第%d个数字的值为%d,删除后表为",k,e); ListTraverse(L); } return 0;}
结果:
1>数组的下表从0开始,防止数组越界
2>注意指针的使用
3>设计程序时尽量考虑全面,各种可能出现的问题都包含在内
4>变量命名要有一定的含义,见其名知其意
2.线性表链式存储
#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef struct Node{ ElemType data; struct Node *next;}Node,*LinkList;int InitList(LinkList *L)//初始化{ *L=(LinkList)malloc(sizeof(Node)); if(!(*L)) return 0; else (*L)->next=NULL; return 1;}//LinkList L,L有定义时,值要么为NULL,为一个空表,要么为第一个节点的地址,既头指针int ListLength(LinkList L)//求表长,LinkList L指某链表的第一个节点地址放在指针变量L中{ int i=0; LinkList p=L->next; while(p) { i++; p=p->next; } return i;}int ListEmpty(LinkList L){ LinkList p=L->next; if(p) return 0; else return 1;}int ClearList(LinkList *L)//整表删除{ LinkList p,q; p=(*L)->next;//P指向第一个结点 while(p) { q=p->next; free(p); p=q; } (*L)->next=NULL;//头结点指针域为空 return 1;}int GetElem(LinkList L,int i,ElemType *e){ int j=1; LinkList p; p=L->next; while(p&&j<i) { p=p->next; j++; } if(!p||j>i) //if(!p||j>=i) { return 0; } *e=p->data; return 1;}int ListTraverse(LinkList L){ LinkList p=L->next; while(p) { printf("%3d",p->data); p=p->next; } printf("\n"); return 1;}int ListInsert(LinkList *L,int i,ElemType e){ LinkList p,s; p=*L; int j=1; while(p&&j<i) { p=p->next; j++; } if(!p&&j>i) { return 0; } else s=(LinkList)malloc(sizeof(Node)); s->data=e; s->next=p->next; p->next=s; return 1;}int ListDelete(LinkList *L,int i,ElemType *e){ int j=1; LinkList p,q; p=*L; while(p->next&&j<i) { p=p->next; j++; } if(!(p->next)||j>i) return 0; q=p->next; p->next=q->next; *e=q->data; free(q); return 1;}int main(){ LinkList L; ElemType e,f; int i,j,k,m; i=InitList(&L); printf("初始化后长度为:L.length=%d\n",ListLength(L)); for(j=1;j<=5;j++) { i=ListInsert(&L,1,j); } printf("在表头插入1到5之后:L.data="); ListTraverse(L); printf("表长:ListLength=%d\n",ListLength(L)); i=ListEmpty(L); printf("表是否为空:i=%d(1代表是,0代表否)\n",i); i=ClearList(&L); printf("清空表后表长:ListLength=%d\n",ListLength(L)); i=ListEmpty(L); printf("表是否为空:i=%d(1代表是,0代表否)\n",i); for(j=1;j<=5;j++) { i=ListInsert(&L,j,j); } printf("表尾插入1到5之后:L.data="); ListTraverse(L); i=ListLength(L); printf("你想查找第几个元素?"); scanf("%d",&k); if(k>0&&k<=i) { GetElem(L,k,&e); printf("第%d个元素的值是%d\n",k,e); } else printf("查找元素不存在\n"); j=ListLength(L); printf("你想删除第几个数字?"); scanf("%d",&m); if(m>0&&m<=j) { ListDelete(&L, m,&f); printf("删除成功,删除的数字是%d\n",f); printf("删除后表为:"); ListTraverse(L); } else printf("不存在此元素\n"); return 0;}
- 数据结构(C语言实现)
- 数据结构C语言实现
- 数据结构(C语言实现)
- 数据结构C语言实现系列
- 数据结构,C语言实现四则运算
- 数据结构C语言实现栈
- 数据结构C语言实现数组
- 数据结构.栈(C语言实现)
- 数据结构.队列(C语言实现)
- 数据结构.单链表(C语言实现)
- c语言实现tree数据结构
- 数据结构--单链表c语言实现
- 数据结构---栈C语言实现
- 数据结构---队列C语言实现
- 【数据结构】C语言实现单链表
- 数据结构栈C语言实现
- [数据结构]魔王语言解释 c语言实现
- 数据结构之队列的实现(c语言)
- 使用“数据库配置助手”时报“使用Database Control配置数据库时,……配置监听程序”的警告
- 堆和栈的区别
- C#索引器
- 第一篇博客 写于2013春实训后
- C专家编程 前言 第一章
- 数据结构(C语言实现)
- Codeforces Round #174 (Div. 1) (A, B, C)
- 只用赋值、加1、循环三个操作实现一个减1的运算
- spring中读取xml配置文件、获取bean的几种方式
- weka关联的ARFF文件
- 企业文字
- 属性“layout_weight”解析
- 归并排序和快速排序
- 经典SQL语句大全