/*
*程序不足之处: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>#include <malloc.h>
typedef struct nlist
{
int *np
int len//已使用地址个数
int maxlen//最大地址个数
}NLT
NLT *createlist()//创建顺序表
int addtolist(NLT *nlist)//向顺序表插入元素
void pList(NLT *nlist)//遍历顺序表
int main()
{
int i
NLT *nlist=createlist()
if(nlist)
{
for(i=0i<nlist->maxleni++)
addtolist(nlist)
pList(nlist)
}
return 0
}
void pList(NLT *nlist)//遍历打印,空格分割,最后一个数后面没有空格
{
int i
for(i=0i<nlist->len-1i++)
printf("%d ",nlist->np[i])
printf("%d",nlist->np[nlist->len-1])
}
NLT *createlist()
{
NLT *nlist=NULL
nlist=(NLT *)malloc(sizeof(NLT))
scanf("%d",&nlist->maxlen)
nlist->np=(int *)malloc(sizeof(int)*nlist->maxlen)
if(!nlist || !nlist->np)
{
printf("内存申请失败!\n")
return NULL
}
nlist->len=0
return nlist
}
int addtolist(NLT *nlist)
{
if(nlist->len<nlist->maxlen)//如果存储空间未满,保存元素,保存成功返回1 失败返回0
{
scanf("%d",&nlist->np[nlist->len])
nlist->len++
return 1
}
else //这里可以写当存储满的之后,空间扩容,本题用不到所以我不写了
return 0
}
/*
GY52122008
请输入插入字符 : -
请输入插入位置 : 7
GY5212-2008
Press any key to continue
*/
#include <malloc.h>#include <stdio.h>
#include <string.h>
#define maxsize 100
typedef struct {
char *data
int length
}sqlist
void initlist(sqlist *&L) { //初始化顺序表
L = (sqlist *)malloc(sizeof(sqlist))
L->data = (char *)malloc(maxsize)
L->length = 0
}
void createlist(sqlist *&L,char a[],int n) { //建立顺序表
int i
for(i = 0i < ni++) L->data[i] = a[i]
L->length = n
}
bool listinsert(sqlist *&L,int i,char e) { //插入数据元素
int j
if(i < 1 || i > L->length + 1) return false
i--
for(j = L->lengthj > ij--) L->data[j] = L->data[j - 1]
L->data[i] = e
L->length++
return true
}
bool listdelete(sqlist *&L,int i,char &e) { //删除数据元素
int j
if(i < 1 || i> L->length) return false
i--
e = L->data[i]
for(j = 1j < L->length - 1j++) L->data[j] = L->data[j + 1]
L->length--
return true
}
int listlength(sqlist *L) { //求线性表长度
return(L->length)
}
void destroylist(sqlist *&L) {
free(L)
}
int locateelem(sqlist *L,char e) { //按元素查找
int i = 0
while(i < L->length && L->data[i] != e) i++
if(i >= L->length) return 0
else return i + 1
}
void displist(sqlist *L) { //输出线性表
int i
for(i = 0i < L->lengthi++) printf("%c",L->data[i])
printf("\n")
}
int main() {
int pos,len
char ch,data[50] = "GY52122008"
sqlist *L
initlist(L) // 先初始化
len = strlen(data)
createlist(L,data,len) // 创建表
displist(L)
printf("请输入插入字符 : ")
scanf("%c",&ch)
printf("请输入插入位置 : ")
scanf("%d",&pos)
if(listinsert(L,pos,ch)) displist(L)
else printf("插入操作失败。\n")
free(L->data)
free(L)
return 0
}