【100分】数据结构——使用C语言(线性表)

供稿:hz-xin.com     日期:2025-01-17
数据结构(C语言描述) 线性表实验

#include
#include
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
int * elem;
int length;
int listsize;
}SqList;
//SqList sq;
void InitList_Sq(SqList *sq) //初始化列表
{
sq->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
sq->length=0;
sq->listsize=LIST_INIT_SIZE;
printf("---申请空间成功---!
");
}
void GetElem(SqList *sq,int i)//获取第i位置元素的值
{
int *p;
p=&(sq->elem[i-1]);
printf("%d",*p);
printf("
");
}
int ListInsert_Sq(SqList *sq,int i,int a)//在i位置之前插入a
{
int *p,*q;
if(isq->length+1)
{
printf("---位置不合法---!
");
return 0;
}
if(sq->length>=sq->listsize)
{
int* newbase=(int *)realloc(sq->elem,(sq->listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
{
printf("申请空间溢出
");
return 0;
}
sq->elem=newbase;
sq->listsize+=LISTINCREMENT;
}
p=&(sq->elem[i-1]);//p指向第i位置的元素
q=&(sq->elem[sq->length-1]);//q指向最后一个元素
for(;q>=p;--q) *(q+1)=*q;
*p=a;
++sq->length;
return 1;
}
int ListDelete_Sq(SqList *sq,int i) //删除i位置上的值
{
int *p,*q;
if(isq->length) return 0;
p=&(sq->elem[i-1]);//p指向第i位置的元素
q=sq->elem+sq->length-1;//q指向最后一个元素
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--sq->length;
return 1;
}
void visit(SqList *sq)//输出数据
{
int i=1;
for(;ilength;i++)
{
int *p;
p=&sq->elem[i-1];
printf("%d",*p);
printf(" ");
}
}
void main()
{
int i=1,a=0,boo=1,number=0;
SqList s,*sq;
sq=&s;
InitList_Sq(sq);
printf("初始化空表
");
printf("输入数据个数:
");
scanf("%d",&number);
printf("输入%d个数据:",number);
printf("
");
for(;i<=number;i++)
{
scanf("%d",&a);
if(boo=ListInsert_Sq(sq,i,a))
{
printf("---插入成功!---
");
}
else
{
printf("---插入不成功,重新插入---!
");
i=i-1;
}
}
printf("输出所有元素
");
visit(sq);
printf("
");
printf("输出删除的位置:");
scanf("%d",&a);
if(boo=ListDelete_Sq(sq,a))
{
printf("---数据删除成功!---
");
}else
{
printf("---没有删除成功---
");
}
printf("输出所有元素:
");
visit(sq);
printf("
");
printf("输出要显示数据的位置:");
scanf("%d",&a);
printf("输出%d位置数值
",a);
if(asq->length)
{
printf("---输出位置的数据不存在---
");
}
else
{
GetElem(sq,a);
}

}
以上是可直接运行的源程序
运行结果:
---申请空间成功---!
初始化空表
输入数据个数:
3
输入1个数据:3
---插入成功!---
输入2个数据;8
---插入成功!---
输入3个数据:5
---插入成功!---
输出所有元素:3 5 8
输出删除的位置:2
---数据删除成功!---
输出所有元素;3 8
输出要显示数据的位置:2
"输出2位置数值:8

直接上源码吧。
/*线性表功能的实现*/
#include
//定义常量 存储空间的初始化分配
#define MAXSIZE 20
#define TRUE 1
#define ERROR -1
#define FALSE 0
#define OK 1
//用typedef定义类型
typedef int Status;
typedef int ElemType;
//定义一个结构体类型
typedef struct{
ElemType data[MAXSIZE];
int length;
} SqList;
//初始化函数
Status initList(SqList *L){
L->length = 0;
return OK;
}
//返回线性表的长度
Status getListLength(SqList L){
return L.length;
}
//线性表为空返回true,否则返回false
Status listEmpty(SqList L){
if(L.length == 0){
return TRUE;
}
return FALSE;
}
//线性表清空,长度为0
Status clearList(SqList *L){
L->length = 0;
return OK;
}
//获取指定的元素的值,返回下标为i - 1的元素,赋值给e
Status getElem(SqList L, int i, ElemType *e){
//判断元素位置是否合法[i]
if(i > L.length || i < 1){
printf("查找的位置不正确
");
return ERROR;
}
//判断线性表是否为空
if(listEmpty(L)){
return ERROR;
}
*e = L.data[i - 1];
return OK;
}
//在线性表中查找指定的e相等的元素,如果查找成功,返回该元素的下标,否则返回ERROR
Status locateElem(SqList L, ElemType e){
int i;
for(i = 0; i < L.length - 1; i++){
if(L.data[i] == e){
return i;
}
}
printf("没有查找到元素 %d 指定的下标
",e);
return ERROR;
}
//自动创建 MAXSIZE 个元素,并赋值为0
Status createList(SqList *L){
int i;
for(i = 0; i < 10; i++){
L->data[i] = 0;
}
L->length = 10;
return OK;
}
//在线性表中第i个位置前插入新元素e
Status listInsert(SqList *L, int i, ElemType e){
//判断长度是否可以允许插入新的数据
if(L->length >= MAXSIZE){
printf("空间已满,不能再插入数据
");
return FALSE;
}
//判断插入位置的合法性
if(i L->length) {
printf("插入位置不正确
");
return FALSE;
}
int j;
for(j = L->length - 1; j >= i; j--){
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e;
L->length++;
return TRUE;
}
//删除线性表中第i个元素,成功后表长减1,用e返回其值
Status deleteList(SqList *L, int i, ElemType *e){
//判断线性表是否为空
if(listEmpty(*L)){
return ERROR;
}
//判断删除的位置是否合法
if(i L->length) {
printf("删除位置不合法
");
return ERROR;
}
*e = L->data[i - 1];
for(i; i length; i++){
L->data[i - 1] = L->data[i];
}
L->length--;
return TRUE;
}
//遍历线性表
Status listTraverse(SqList L){
int i;
for(i = 0; i < L.length; i++){
printf("%d ",L.data[i]);
}
printf("
");
return OK;
}
//主程序
int main(void){
SqList L;
ElemType e;
initList(&L);
int option = 1;
int input_number;
int res;
ElemType input_value;
printf("
1.遍历线性表
2.创建线性表
3.清空线性表
4.线性表插入
5.查找表中元素
6.判断元素是否在表中
7.删除某个元素
8.线性表长度
9.线性表是否为空
0.退出
请选择你的操作:
");
while(option){
scanf("%d",&option);
switch(option){
case 0:
return OK;
break;
case 1:
listTraverse(L);
break;
case 2:
createList(&L);
listTraverse(L);
break;
case 3:
clearList(&L);
listTraverse(L);
break;
case 4:
printf("请输入插入的位置:");
scanf("%d",&input_number);
printf("
");
printf("请输入插入的值:");
scanf("%d",&input_value);
printf("
");
listInsert(&L, input_number, input_value);
listTraverse(L);
break;
case 5:
printf("请输入要查找的位置:");
scanf("%d",&input_number);
printf("
");
getElem(L, input_number, &input_value);
printf("第%d个元素的值为:%d
",input_number,input_value);
break;
case 6:
printf("请输入要查找的元素:");
scanf("%d",&input_value);
printf("
");
res = locateElem(L, input_value);
if(res != ERROR){
printf("值为%d在表中的第%d个位置
",input_value,input_number);
}
break;
case 7:
printf("要删除第几个元素?");
scanf("%d",&input_number);
printf("
");
deleteList(&L, input_number, &input_value);
listTraverse(L);
break;
case 8:
res = getListLength(L);
printf("线性表的长度是:%d",res);
break;
case 9:
res = listEmpty(L);
if(res){
printf("线性表的是空的");
}else{
printf("线性表的是不是空的");
}
break;
}
}
return OK;
}

线性表的特征是:
1. 元素之间是有序的,如果元素存在多个,则第一个元素无前驱,最后一个无后继,其它元素都有且只有一个前驱和后继.
2. 元素个数是有限的. 当n=0是,称为空表
线性表实现方式有两种,分别是顺序存储结构和链式存储结构,它们之间各有优缺点 . 根据需求的不同进行选择不同的存储结构.
线性表存储结构的优缺点
优点:
1. 无须为表中元素之前的逻辑关系而增加额外的存储空间
2. 可以快速的存取表中的任一位置的元素
缺点:
1. 插入和删除操作需要移动大量元素
2. 当线性表长度变化较大时,难以确定存储空间的容量.
3. 造成存储空间的”碎片”.

//c++的头文件,我是用c++编写的,有一些该成了C但是有些输入输出没有改
//希望楼主不要建议哦,费了很久的时间写的啊!
#include<iostream>//c++的头文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>
#define error 0
#define OVERFLOW 1
#define OK 1
using namespace std;//c++的一个指令
typedef struct
{
int *elem; //存储空间基址
int length; //当前长度
int listsize;//当前分配的存储容量
// (以sizeof(ElemType)为单位)
//int *next;
}sqlist;

void initList(sqlist &La)
{//构造一个空线性表L
La.elem=(int *) malloc(100 *sizeof(int));//分配空间
if (!La.elem) exit(-2);//未分配则 跳出;
La.length=0;
La.listsize= 100 ;
}

int Listinsert_sq(sqlist &L,int i,int e) // listinsert_sq;插入一个元素
{int *newbase;int *p,*q;
if (i<1 || i>L.length+1) return error;
if (L.length>=L.listsize)//空间不足追加
{newbase=(int*) realloc(L.elem,(L.listsize+10) *sizeof(int));
if (!newbase)
exit(-2);
L.elem=newbase; L.listsize+=10 ;
return 0;
}
q=&(L.elem[i-1]);//指针指向确定插入的位子
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;//指针后移
*q=e; //实现元素的插入
++L.length;
return 0;
}
int ListDelete_sq(sqlist &L,int i)//删除i位子的元素
{int *p,*q;
if((i<1)||(i>L.length)) return 0;
p=&(L.elem[i-1]);
//e=*p;
cout<<"被删除的值是:"<<*p<<endl;
for(q=&(L.elem[L.length-1]);p<q;p++)
*p =*(p+1);//指针前移,覆盖前面的存储的数据
--L.length;
return 1;
}
int Getelem(sqlist &L)//输入表的数据
{ int n;
cout<<"输入数列的个数:"<<endl;
cin>>n;
printf("按大小顺序输入n个数:");//cout<<"按大小顺序输入n个数:";
if(n<0||n>L.listsize ) return 0;
for(int i=0;i<n;i++)//循环输入元素
{ cin>>L.elem [i];
L.length ++;//表长度
}
cout<<"这数列的长度:"<<L.length <<endl;
return 1;
}
int Poplist(sqlist &L)//输出函数
{
for(int j=0;j<L.length ;j++)
cout<<L.elem[j]<<" ";
printf("\n");//cout<<endl;
return 0;
}
void ListMerge(sqlist La,sqlist Lb, sqlist &Lc)//合并函数,
{ int *pa,*pb,*pa_list ,*pb_list,*pc;
pa=La.elem;pb=Lb.elem;//用pa和pb指向表头
Lc.length=La.length+Lb.length;
Lc.listsize=Lc.length;
Lc.elem=(int *)malloc(Lc.listsize*sizeof(int ));//合理分配Lc的空间
if(!Lc.elem) exit(-2);
pa_list=&(La.elem[La.length-1]);pb_list=&(Lb.elem[Lb.length-1]);//用pa-list和pb_list指向表未
pc=Lc.elem;
while(pa<=pa_list&&pb<=pb_list)//合并算法
{ if(*pa>=*pb){ *pc++=*pb++;*pc++=*pa++;}

//if(*pa=*pb){ *pc++=*pa++;*pc++=*pb++; }

else {*pc++=*pa++;*pc++=*pb++;}
}
while(pa<=pa_list) *pc++=*pa++;//插入剩余的元素;
while(pb<=pb_list) *pc++=*pb++;
}
int main()
{ sqlist La,Lb,Lc;int i,e;
initList(La);
Getelem(La);
initList(Lb);
Getelem(Lb);
ListMerge(La,Lb,Lc);
Poplist(Lc);
printf("input munber 要删除的位子i \n:");
scanf("%d",&i);// cin>>i;
ListDelete_sq(La,i);
Poplist(La);//我这里是用表La做例子。也可用Lb。。。
printf("输出要插入的位子和元素:\n");
scanf("%d%d",&i,&e);//cin>>i>>e;
Listinsert_sq(Lb,i,e);
Poplist(Lb);//我这里是用表Lb做例子。也可用La。。。
return 0;
}
终于全搞定了,还有些不足,希望对楼主有用!

写起来有点费时间,还有没有数据类型怎么写,写了也用不了
推荐一本书《数据结构》——严蔚敏、吴伟民写的
有视频 自己搜索

用数据结构(C语言)编写运动会分数统计程序
用数据结构(C语言)编写运动会分数统计程序 参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5... 参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+...

数据结构 课程设计C语言版 本人现..跪求一道课程设计答案 有哪..位的...
数据结构 课程设计C语言版 本人现..跪求一道课程设计答案 有哪..位的大仙帮帮我,现在只能给100分,完了追 题目:职工工资管理系统(编号、姓名、年龄、性别、基础工资、补贴工资、扣除工资、总工资){密码启动、修改模块、数据输入模块、数据插入模块、数据统计模块(分别统计基础工资、补贴... 题目:职工工资管理系统...

数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成...
一、单链表的建立 有了动态内存分配的基础,要实现链表就不难了。所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:1、数据域:用来存储...

c语言题型,数据结构题
scanf("%ld %c", &pNew->num, &pNew->sex);pTail->pNext = pNew;pTail = pNew;++n;} } int deletInfo(pStu stu, long numTemp){ pStu pTail = NULL, pHead = NULL;pHead = stu;pTail = stu->pNext;while(pTail){ if(pTail->num == numTemp){ pHead->pNext = p...

关于数据结构(C语言)的几个题
第二步s的后继指向q的后继节点;第三步q的后继指向s 4.查找72只需2步:第一步:设立low、high与mid指针,将72与mid指向的值即48比较;第二部:72比48大,low指向mid+1,重新算出mid,指向72,再与72比较,即查找成功。最多比较次数参考严蔚敏《数据结构》第九章 查找 220页。5.例如图中这...

用c语言编写100!(100的阶乘)
\/\/ 注释比较多,希望你不要感到厌烦,呵呵。\/\/ 还记得10进制的乘法么?\/\/ 567 \/\/ * 5 \/\/ --- \/\/ 2835 \/\/ 用编程语言表示出来就是 \/\/ 当前的int a[4] ={0, 5, 6, 7} \/\/ 然后从最低位开始用5去乘以每一位,少于10的部分就是这 \/\/ 个位新的值...

c语言数据结构?
源码 运行结果 源码:include<stdio.h> typedef struct student{ int age;char name[10];int *a ;struct student*next;}stu;int main(){ stu *p,*q;scanf("%s",p->name);scanf("%s",q->name);p->next=q;printf("%s ",p->name);printf("%s",p->next->name);return 0;} ...

考研复试数据结构一般用什么语言
在考研复试的数据结构部分,通常使用的编程语言是C语言。Java 也是一种可行的选择,但因其面向对象的特性,部分数据结构的相关知识可能不会被考到。因此,建议使用C语言来准备这部分内容。数据结构在计算机科学中扮演着核心角色,它影响着算法的效率和程序的性能。C语言作为一门经典且高效的编程语言,广泛...

...结构课程设计——制作浏览器插件(要求使用c语言),在线等,急!_百度...
学习浏览器插件开发相关知识:了解浏览器插件开发的基本概念、原理和相关技术,例如浏览器扩展开发、DOM操作、HTTP请求等。设计插件的架构:根据插件的功能和目标,设计插件的整体架构,包括插件的入口点、事件处理机制、数据结构等。考虑如何与浏览器进行交互和响应用户操作。实现插件功能:使用C语言编写插件的...

C语言数组的定义以及使用
C语言中的数组是一种数据结构,它将具有相同类型的数据项以有序的方式组织在一起。数组的定义和使用在编程中非常普遍,例如在编写程序时,可以利用数组来存储和处理一系列数值。例如,下面是一个C语言程序,它定义了一个整型数组,用于存储10个整数值。include int main() { int ary[10]; \/\/数组...