C语言实现顺序表,warning C4700: 使用了未初始化的局部变量“s”,为什么

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
typedef int Elemtype;
typedef struct
{
Elemtype *data;
int length;
int listsize;
}Lnode;
void Initlnode(Lnode *s)
{
s->data=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));
s->length=MAXSIZE;
s->listsize=0;
}
void Insertlnode(Lnode *s,int i,Elemtype e)
{
int m;
if(i<1||i>s->length+1)printf("WRONG!\n");
else
{
for(m=s->length-1;m>=i-1;i--)
s->data[i+1]=s->data[i];
}
s->data[i]=e;
s->listsize++;
}
void Delete(Lnode *s,int i)
{
int n;
if(i<1||i>s->length)printf("WRONG!\n");
for(n=i;n<s->length;n++)
s->data[n]=s->data[n-1];
s->listsize--;
}
void main()
{
Lnode *s;
Initlnode(s);
for(int i=0;i<5;i++)
Insertlnode(s,i,i);
Delete(s,3);
for(int i=0;i<4;i++)
printf("%d",s->data[i]);
}

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MAXSIZE 15

typedef int Elemtype;

typedef struct
{
Elemtype *data;
int length;
int listsize;
}Lnode;

void Initlnode(Lnode **s)
{
puts("初始化顺序表:");
*s=(Lnode*)malloc(sizeof(Lnode));
(*s)->data=(Elemtype*)malloc(MAXSIZE*sizeof(Elemtype));
(*s)->length=MAXSIZE;
(*s)->listsize=0;
}

//i基于位置顺序(1~s->listsize+1),非基于下标
void Insertlnode(Lnode *s,int i,Elemtype e)
{
int m;

if(s->listsize>=s->length)
{
printf("顺序表空间已不足\n");
}
else if(i<1 || i>s->listsize+1)
{
printf("WRONG!\n");
}
else
{
for(m=s->listsize-1;m>=i-1;m--)
s->data[m+1]=s->data[m];
s->data[i-1]=e;
s->listsize++;
}
}

void Output(Lnode *s)
{
for(int i=0;i<s->listsize;i++)
printf("%d%c",s->data[i],(s->listsize-1==i ? '\n' : ' '));
}

void Free(Lnode *s)
{
if(s->data)
free(s->data);
if(s)
free(s);
}

//i基于位置顺序(1~s->listsize),非基于下标
void Delete(Lnode *s,int i)
{
int n;

if(s->listsize<=0)
{
printf("顺序表已空\n");
}
else if(i<1 || i>s->listsize)
{
printf("WRONG!\n");
}
else
{
for(n=i-1;n<s->listsize;n++)
s->data[n]=s->data[n+1];
s->listsize--;
}
}

void InsertTest(Lnode *s,int insloc,Elemtype e)
{
printf("在第%d个位置插入1个元素%d后:\n",insloc,e);
Insertlnode(s,insloc,e);
Output(s);
printf("容量:%d,当前长度:%d\n",s->length,s->listsize);
printf("\n");
}

void DeleteTest(Lnode *s,int delloc)
{
printf("删除第%d个元素后:\n",delloc);
Delete(s,delloc);
Output(s);
printf("容量:%d,当前长度:%d\n",s->length,s->listsize);
printf("\n");
}

void cls(Lnode *s)
{
printf("按回车键清屏:");
scanf("%*[^\n]");
getchar();
system("cls");
printf("容量:%d,当前长度:%d\n",(*s).length,(*s).listsize);
printf("\n");
}

void Test(Lnode *s)
{
int n,t;

//删除第3个元素(下标为2的元素)
n=3;
DeleteTest(s,n);

//删除第0个元素
n=0;
DeleteTest(s,n);

//删除第s->listsize+1个元素
n=s->listsize+1;
DeleteTest(s,n);

//删除第1个元素
n=1;
DeleteTest(s,n);

//删除第s->listsize个元素
n=s->listsize;
DeleteTest(s,n);

srand(time(NULL));
//插入5个元素
for(n=0;n<5;n++)
{
t=rand()%(s->length+1)+1;
InsertTest(s,t,rand());
}
//填满所有剩余空间
while(s->listsize<s->length)
{
t=rand()%(s->length+1)+1;
InsertTest(s,t,rand());
}
//再尝试插入5个元素(在空间已不足的基础上)
for(n=0;n<5;n++)
{
t=rand()%(s->length+1)+1;
InsertTest(s,t,rand());
}
//删除所有元素
while(s->listsize>0)
DeleteTest(s,1);
cls(s);
//再尝试删除5个元素(在顺序表已空的基础上)
puts("再尝试删除5个元素:");
for(n=0;n<5;n++)
{
t=rand()%s->length+1;
DeleteTest(s,t);
}
cls(s);
//重新插入5个元素(在空顺序表的基础上)
puts("重新插入5个元素:");
while(s->listsize<s->length && s->listsize<5)
{
t=rand()%(s->length+1)+1;
InsertTest(s,t,rand());
}
}

int main()
{
const float Factor=0.65;
Lnode *s;
int n;

Initlnode(&s);
for(int i=0;i<s->length*Factor;i++)
Insertlnode(s,i+1,i+1);
Output(s);
printf("容量:%d,当前长度:%d\n",s->length,s->listsize);
printf("\n");

Test(s);

Free(s);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-04-06
main函数中没有将s初始化就传递给了Initlnode函数,Initlnode函数亦没有将s初始化就直接对s解引用。追问

应该如何改?主程序里不初始化变量就不能调用函数初始化吗?

追答

初始化某个变量和将这个变量传递给某个函数并没有直接关系,但是使用某个变量的值前,该变量必须已经被初始化。可以在main函数中初始化,也可以在Initlnode中初始化。

void Initlnode(Lnode *s)
{
    s = (LNode*)malloc(sizeof(LNode));
    s->data=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));
    s->length=MAXSIZE;
    s->listsize=0;
}

相似回答