/*
*程序不足之处:1,main函数不应键型该为 void main
* 2,创建空的顺序表函数中 SqList L//定义顺序表L L是局部变量,
函数结束即销毁,应该用指针代替
* 3,SqList CreateList(SqList L) //创建顺序表(非空)函数中:
scanf("%d",&L.elem)L里面的elem本来就是地址,
没必要 再加&符号,且每次输入都一直放在首地址,
没达到程序所要表达的意思
* 4,void print(SqList L) //输出当前顺序表 函数中:
printf("%-3d",L.elem)和上面是一样的道理
* 5,main函数中没有将申请的内存释放
*现将程序稍作修改如下,望采纳
*/
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define Icreament 20
typedef int ElemType //用户自定义数据元素类型
typedef struct
{
ElemType *elem //顺序表的基地址
int length //顺序表的当前长度
int listsize //预设空间容量
}SqList //线性表的顺序存储结构
SqList* InitList() //创建空的顺序表
{
SqList* L = (SqList*)malloc(sizeof(SqList))//定义顺序表L
if(!L)
{
塌掘 printf("空间划分失败,程序退出\n")
return NULL
}
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType))
if(!L->elem)
{
printf("空间划分失败,程序退出\n")
return NULL
}
L->length=0
L->listsize=LIST_INIT_SIZE
return L
}
int CreateList(SqList* L) //创建顺序表(非空)
{
int number //顺序表中元素的个数
int i //循环变量
printf("请输入顺序表中元素的个数:")
scanf("%d",&number)
if(number >LIST_INIT_SIZE) 团亮核//一定要判断输入的个数是否大于顺序表的最大长度
{
printf("输入个数大于顺序表的长度\n")
return 0
}
for(i=0i<numberi++)
{
printf("输入第%d个数: ",i+1)
scanf("%d",L->elem+i) //L->elem+i:每次的输入都保存在顺序表元素中的下一个地址,而不是一直放在元素的首地址
}//给顺序表中每个数据元素赋值
L->length=number //当前顺序表的长度
return 1
}
void print(SqList* L) //输出当前顺序表
{
int i
for(i=0i<L->lengthi++)
{
printf("%-3d",*(L->elem + i)) //L->elem+i:和输入是一个道理
}
printf("\n")
}
int main()
{
SqList* L = InitList() //申请一个指向顺序表的指针,并对其初始化
if(!L) //判断申请是否成功
{
printf("初始化线性表失败\n")
return 1
}
if(!CreateList(L)) //判断创建顺序表是否成功
{
printf("创建顺序表失败\n")
return 1
}
print(L) //打印顺序表
free(L->elem) //释放申请的顺序表元素的内存
free(L) //释放申请的顺序表内存
return 0
}
运行效果如图:
#include <stdio.h>#define LIST_INIT_SIZE 10
#define LISTINCREMENT 10
#define ERROR 0
typedef struct{
int *elem
int length
int listsize
} SqList
void InitList_Sq(SqList *l)
{
l->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int))
if(!l->elem) exit(0)
l->length=0
l->listsize=LIST_INIT_SIZE
}
int InList(SqList 缺态*l)
{
int *p,*newbase
p=l->elem
while(1)
{
for(p<l->elem+l->listsizep++)
{
scanf("%d",p)if(*p==-1) breakl->length++
}
if((p==l->elem+l->listsize))
{
newbase=(int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int))
p=l->elem+l->length
l->listsize=l->listsize+LISTINCREMENT
if(!l->elem) return ERROR
}
if(*p==-1) break
}
return 1
}
void PrList(SqList *l)
{
int *p,i
p=l->elem
for(p<l->elem+l->lengthp++)
printf("%d ",*p)
}
int ListInsert_sq(SqList *l,int i,int e)
{
int *newbase,*p,*q
if(i<1||i>l->length) return ERROR
if(l->length==l->listsize)
{
newbase=(int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int))
if(!newbase) return ERROR
l->elem=newbase
l->listsize+=LISTINCREMENT
}
q=l->elem+i-1
for(p=l->elem+l->length-1p>=qp--)
*(p+1)=*(p)
*q=e
l->length+=1
return 1
}
int ListDelet_sq(SqList *l,int i)
{
int *p,e
if((i<1)||(i>l->length)) return ERROR
p=l->elem+i-1
e=*p
for(p<l->elem+l->length-1p++)
*p=*(p+1)
l->length--
printf("要删除的元素是:%d\n",e)
return 1
}
void main()
{
int i,j,n
char a
SqList la
InitList_Sq(&la)
printf("请输入顺序表中的元素:\n")
if(!InList(&la)) return ERROR
do
{
printf("请输入需要插入元素的位置及元素:(a,b)\n")
scanf("%d,%d",&i,&j)
if(!ListInsert_sq(&la,i,j)) return ERROR
printf("是否还需要插入元素?(伏巧源N/Y)")
getchar()
scanf("%c",&a)
if(a=='N'||a=='n') break
}while(1)
do
{
printf("请输入需要删除宽裤元素的位置:\n")
scanf("%d",&i)
if(!ListDelet_sq(&la,i)) return ERROR
printf("是否还需要删除元素?(N/Y)")
getchar()
scanf("%c",&a)
if(a=='N'||a=='n') break
}while(1)
printf("最后的顺序表为:\n")
PrList(&la)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)