这个C程序执行不了- -

damonZengg 2008-10-17 03:08:59

/*单链表的各种操作*/

# define null 0

typedef char ElemType; /*字符型数据*/

typedef struct LNode
{
ElemType data;
struct LNode *next;
};

setnull(struct LNode **p);
int length(struct LNode **p);
ElemType get(struct LNode **p,int i);
int locate(struct LNode **p,ElemType x);
void insert(struct LNode **p,ElemType x,int i);
void delete(struct LNode **p,int i);
void display(struct LNode **p);

main()
{
struct LNode *head; /*定义静态变量*/
int select,x1,x2,x3;
int i,n;
int m,g;
char e,y;

head=setnull(&head); /*建立链表并设置为空表*/
printf("请输入数据长度:");
scanf("%d",&n);
for(i=1;i<n;i++)
{
printf("将数据插入到单链表中:");
scanf("%c",y);
insert(&head,y,i);
display(&head);

printf("select 1 求长度 length()\n");
printf("select 2 取结点 get()\n");
printf("select 3 求值查找 locate()\n");
printf("select 4 删除结点 delete()=\n");
printf("input your choice: ");
scanf("%d",&select);
switch(select)
{
case 1:
{
x1=length(&head);
printf("输出单链表的长度%d ",x1);
display(&head);
}break;
case 2:
{
printf("请输入要取得的结点:");
scanf("%d",&m);
x2=get(&head,m);
printf(x2);
display(&head);
}break;

case 3:
{
printf("请输入要查找的数据:");
scanf("%c",&e);
x3=locate(&head,e);
printf(x3);
display(&head);
}break;
case 4:
{
printf("请输入要删除的结点:");
scanf("%d",&g);
delete(&head,g);
display(&head);
}break;
}
}
}

setnull(struct LNode **p)
{
*p=null;
}

int length(struct LNode **p)
{
int n=0;
struct LNode *q=*p;
while(q!=null)
{
n++;
q=q->next;
}
return(n);
}

ElemType get(struct LNode **p,int i)
{
int j=1;
struct LNode *q=*p;
while(q<i&&q!=null)
{
q=q->next;
j++;
}
if(q!=null)
return(q->data);
else
printf("位置参数不准确!\n");
}


int locate(struct LNode **p,ElemType x)
{
int j=1;
struct LNode *q=*p;
while(q!=null&&q->data!=x)
{
q=q->next;
j++;
}
if(q==null)
return(-1);
else
return(j);
}

void insert(struct LNode **p,ElemType x,int i)
{
int j=1;
struct LNode *s,*q;
s=(struct LNode *)malloc(sizeof(struct LNode));
s->data=x;
q=*p;
if(i==1)
{
s->next=q;
p=s;
}
else
{
while(j<i-1&&q->next!=null)
{
q=q->next;
j++;
}
if(j==i-1)
{
s->next=q->next;
q->next=s;
}
else
printf("error!\n");
}
}

void delete(struct LNode **p,int i)
{
int j=1;
struct LNode *q=*p,*t;
if(i==1)
{
t=q;
*p=q->next;
}
else
{
while(j<i-1&&q->next!=null)
{
q=q->next;
j++;
}
if(q->next!=null&&j==i-1)
{
t=q->next;
q->next=t->next;
}
else
printf("位置参数不正确!");
}
if(t=null)
free(t);
}


void display(struct LNode **p)
{
struct LNode *q;
q=*p;
printf("单链表显示:");
if(q==null)
printf("这是一个空链表!");
else if (q->next=null)
printf("%c\n",q->data);
else
{
while(q->next!=null)
{
printf("%c->",q->data);
q=q->next;
}
printf("%c\n",q->data);
}
}






我用VC++6.0可以编译通过此程序,但每次执行都出现下面这个对话框终止程序怎么办?

"0x00404184"指令引用的"0xffffffcc"内存。该内存不能为"written".
...全文
285 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgjxwl 2008-10-18
  • 打赏
  • 举报
回复
^_^
damonZengg 2008-10-18
  • 打赏
  • 举报
回复
日啊,但我这边的确是编译通过了啊,只是有9个警告而已- -
zhyinty 2008-10-18
  • 打赏
  • 举报
回复
错误太多了,受不了
damonZengg 2008-10-18
  • 打赏
  • 举报
回复
Compiling...
b.c
D:\workspace\VC6.0\demo\b.c(29) : warning C4047: '=' : 'struct LNode *' differs in levels of indirection from 'int '
D:\workspace\VC6.0\demo\b.c(30) : warning C4013: 'printf' undefined; assuming extern returning int
D:\workspace\VC6.0\demo\b.c(31) : warning C4013: 'scanf' undefined; assuming extern returning int
D:\workspace\VC6.0\demo\b.c(102) : warning C4047: '<' : 'struct LNode *' differs in levels of indirection from 'int '
D:\workspace\VC6.0\demo\b.c(133) : warning C4013: 'malloc' undefined; assuming extern returning int
D:\workspace\VC6.0\demo\b.c(139) : warning C4047: '=' : 'struct LNode ** ' differs in levels of indirection from 'struct LNode *'
D:\workspace\VC6.0\demo\b.c(183) : warning C4013: 'free' undefined; assuming extern returning int
D:\workspace\VC6.0\demo\b.c(35) : warning C4700: local variable 'y' used without having been initialized
D:\workspace\VC6.0\demo\b.c(111) : warning C4715: 'get' : not all control paths return a value

b.obj - 0 error(s), 9 warning(s)



我上面的代码编译后
没有错误,只有警告而已!
你们怎么会说有很多错误?
canican 2008-10-18
  • 打赏
  • 举报
回复
是VC 6.0啊,通不过的
damonZengg 2008-10-18
  • 打赏
  • 举报
回复
还有你们都用什么工具来编译*.c程序啊?为什么我上面C程序在VC 6.0编译通过的情况下,你们说我的代码错误一大堆呢?
帅得不敢出门 2008-10-18
  • 打赏
  • 举报
回复
参考18楼 一步一步改吧
  • 打赏
  • 举报
回复
先从头到尾过一遍,看看函数、语法等是不是c语言的东西。

等到语法没问题了,然后看看逻辑上,慢慢调试。
elegant87 2008-10-18
  • 打赏
  • 举报
回复
错误一大堆啊!没法改!你看看我以前写的一个吧!

//带头结点的建表,判空,删除,插入,找x相同值的结点数,就地逆置,用一主函数实现
#include <iostream>

using namespace std;

template <class ElemType>
class List
{
public:
List();
void InitList();//建表
void Show() const;//输出链表
bool IsEmpty();//判空
void Delete(int i);//删除
void Insert(ElemType e,int i);//插入
void FindEqual(int x);//找x相同的节点数
List<int> *Getnode (int n);//取任意节点
void Reverse();//逆置
~List();
private:
ElemType elem;
List *head;//头指针
List *next;//后继
int length;
};

template <class ElemType>
List<ElemType>::List()
{
elem=0;
head=NULL;
next=NULL;
length=0;
}

template <class ElemType>
void List<ElemType>::InitList()
{
List*p1,*p2;
head=new List;
p1=head;
p2=new List;
int count=0;
cout<<"请输入数值(-1 to quit): ";
cin>>p2->elem;
while(p2->elem!=-1)
{
p1->next=p2;
p1=p2;
++count;
p2=new List;
cin>>p2->elem;
}
p1->next=NULL;
length=count;
}

template <class ElemType>
void List<ElemType>::Show() const
{
if(head!=NULL)
{
List *p=head->next;
cout<<"显示链表的值为: ";
while(p)
{
cout<<p->elem<<" ";
p=p->next;
}
cout<<endl;
}
else
cout<<"表为空表!"<<endl;
}

template <class ElemType>
bool List<ElemType>::IsEmpty()
{
if(length==0)
return true;
else
return false;
}

template <class ElemType>
void List<ElemType>::Insert(ElemType e,int i)
{
if(!IsEmpty())
{
List *p=head;
int j=0;
while(p && j<i-1)
{
p=p->next;
++j;
}
if(!p || j>i-1)
cout<<"插入失败!"<<endl;
else
{
List *s=new List;
s->elem=e;
s->next=p->next;
p->next=s;
++length;
cout<<"插入成功!"<<endl;
}
}
else
cout<<"不能插入,表为空表!"<<endl;
}

template <class ElemType>
void List<ElemType>::Delete(int i)
{
int e;
if(!IsEmpty())
{
List *p=head;
int j=0;
while(p && j<i-1)
{
p=p->next;
++j;
}
if(!p && j>i-1)
cout<<"删除失败!"<<endl;
else
{
e=p->next->elem;
p->next=p->next->next;
--length;
cout<<"删除成功!"<<endl;
cout<<"删除的元素是"<<e<<endl;
}
}
else
cout<<"不能删除,表为空表!"<<endl;
}
template <class ElemType>
void List<ElemType>::FindEqual(int x)
{
if(!IsEmpty())
{
List *p;
int i=0;
bool flag=false;
for(p=head->next;p!=NULL;p=p->next)
{
++i;
if(p->elem==x)
{
flag=true;
cout<<"第"<<i<<"个节点的值与"<<x<<"相等"<<endl;
}
}
if(!flag)
cout<<"没有与"<<x<<"相同的值!"<<endl;
}
else
cout<<"表为空表!"<<endl;
}

template <class Elemtype>
List<int> * List<Elemtype>::Getnode(int n)
{
int i=0;
List* p;
p=head;
while(p && i<n)
{
p=p->next;
++i;
}
return p;
}

template <class ElemType>
void List<ElemType>::Reverse()
{
int center=length/2,i;
ElemType temp;
List *p1,*p2;s
p1=head;
for(i=length;i>center;--i)
{
p2=Getnode(i);
temp=p1->next->elem;
p1->next->elem=p2->elem;
p2->elem=temp;
p1=p1->next;
}
cout<<"逆置成功!"<<endl;
//Show();
}

template <class ElemType>
List<ElemType>::~List()
{
while(head!=NULL)
{
delete head;
head=head->next;
}
}

int main()
{
char ch;
List<int> obj;
int e,i;
cout<<"\t\t1.创建表"<<endl;
cout<<"\t\t2.插入值"<<endl;
cout<<"\t\t3.删除值"<<endl;
cout<<"\t\t4.相同值"<<endl;
cout<<"\t\t5.输出表"<<endl;
cout<<"\t\t6.逆置表"<<endl;
cout<<"\t\t0.退出"<<endl;
do
{
cout<<"请选择操作: ";
cin>>ch;
switch(ch)
{
case '1':
obj.InitList();
break;
case '2':
cout<<"请输入要插入的值: ";
cin>>e;
cout<<"请输入要插入的位置: ";
cin>>i;
obj.Insert(e,i);
break;
case '3':
cout<<"请输入要删除的节点: ";
cin>>i;
obj.Delete(i);
break;
case '4':
cout<<"请输入要查找相同的值: ";
cin>>i;
obj.FindEqual(i);
break;
case '5':
obj.Show();
break;
case '6':
obj.Reverse();
break;
case '0':
cout<<"\t操作完毕!"<<endl;
break;
default :
cout<<"输入错误,请重新输入: ";
break;
}
}while(ch!='0');
system("pause");
return 0;
}



qkhhxkj102 2008-10-18
  • 打赏
  • 举报
回复
帮顶
Crazy_hand 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tomorrowzm 的回复:]
我想在单链表的数据域q->data里面放姓氏,如:zhang->li->zhao->wang

但c语言没有字符串类型,要用什么数据类型?,是要搞一个字符串数组吗?具体怎么实现?
[/Quote]

搞一个字符串数组也可以,还有一种方法就是用指针,不过用完了别忘了释放。。。。。

这里有个完整的,应该有帮助。。
http://yx-postbox.blog.163.com/blog/static/603140502008230102756773/
Darkneece 2008-10-17
  • 打赏
  • 举报
回复
head节点没有分配空间
damonZengg 2008-10-17
  • 打赏
  • 举报
回复
我想在单链表的数据域q->data里面放姓氏,如:zhang->li->zhao->wang

但c语言没有字符串类型,要用什么数据类型?,是要搞一个字符串数组吗?具体怎么实现?
  • 打赏
  • 举报
回复

自己定义的啥就是啥咧, 你定义的为 char
damonZengg 2008-10-17
  • 打赏
  • 举报
回复
不好意思,大学一年级学的C语言,当时学的很浅薄,也没怎么去实践,让大家笑话了,现在在学数据结构,这是一个点链表程序,现在我想搞清楚一个问题,单链表里面的数据q->data是用char类型,还是int类型呢?
canican 2008-10-17
  • 打赏
  • 举报
回复
head=setnull(&head); /*建立链表并设置为空表*/ //去掉head=

printf(x2); //printf(char变量)??

printf(x3); //printf(int)???

pingzi_1119 2008-10-17
  • 打赏
  • 举报
回复
.....
  • 打赏
  • 举报
回复

是C程序???

那这样能用吗? head=setnull(&head);
mifeixq 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tomorrowzm 的回复:]
没出错啊,我这边编译通过喇- -
[/Quote]

寒,不能吧……
damonZengg 2008-10-17
  • 打赏
  • 举报
回复
难道我的vc6.0编译器有问题,我这个程序是c程序,不是c++,各位不要保存为**.cpp啊
加载更多回复(6)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧