| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1921 人关注过本帖
标题:[求助]请版主帮忙看看这个问题
只看楼主 加入收藏
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
 问题点数:0 回复次数:21 
[求助]请版主帮忙看看这个问题

我同学找我帮忙写个题 北邮数据结构程序设计题:

利用单链表实现以下要求

1。输入若干整数,输入过程中将它们构造成单向链表,插入时保持升序 2。从链表中添加或删除指定数值的数据项 3。将构造的上述链表逆项转置 ************************************************ 以下是我写的一个程序

#include <stdio.h> #include <malloc.h> typedef struct node *point; struct node { int data; point next; };

void print(point head)//输出链表 { point p; p=head->next; while(p) { printf("%d -> ",p->data); p=p->next; } printf("NULL "); }

void revers(point head)//链表逆转置 { point p,q,r; p=head->next; q=p->next; r=q->next; if(p==NULL || q==NULL) printf("该链表无须转置。"); p->next=NULL; p=q; while(r->next) { q=r; r=r->next; q->next=p; p=q; } r->next=p; head->next=r; }

void Insert(point p,int x)//按升序插入数据,允许有重复数据 { point q,r; q=p->next; while(q && q->data<x) { p=p->next; q=q->next; } r=(struct node *)malloc(sizeof(struct node)); if(!r) printf("分配失败"); r->data=x; r->next=q; if(!q) r->next=NULL; p->next=r; }

point creat()//任意顺序输入数据,建立升序链表 { int x; point p; point head;

head=(struct node *)malloc(sizeof(struct node)); if(!head) printf("分配失败/n"); p=head; printf("请输入数字:"); scanf("%d",&x); while(x!=0) { Insert(head,x); printf("请输入数字:"); scanf("%d",&x); } printf("您输入的数据为: "); print(head); return head; }

void Delet(point head,int x)//删除所有x { int i; point p; point q; point r; p=head; q=p->next; r=NULL; while(q) { if(q->data==x) { p->next=q->next; r=q; q=q->next; free(r); i++; } else { p=p->next;q=q->next; } } if(i==0) printf("输入的数不存在。"); else { printf("删除后链表变成:"); print(head); } }

void choose(point head) { int x; printf("a. 插入一个数据/n"); printf("b. 删除一个数据/n"); printf("c. 将该链表逆转置/n"); printf("d. 退出程序/n"); printf("请选择操作:/n"); char grade; grade=getchar(); if (grade=='a'||grade=='A') { printf("请输入要插入的数据:"); scanf("%d",&x); Insert(head,x); printf("插入后链表变成:"); print(head); choose(head); } else if (grade=='b'||grade=='B') { printf("请输入要删除的数据:"); scanf("%d",&x); Delet(head,x); printf("删除后链表变成:"); print(head); choose(head); } else if (grade=='c'||grade=='C') { printf("逆转置前链表为:"); print(head); revers(head); printf("逆转置后链表为:"); print(head); } else if (grade=='d'||grade=='D'); else { printf("输入错误,请重新选择:/n"); choose(head); } }

void main() { point head; head=creat(); choose(head); }

*********************************

运行环境VC++6.0 这个程序在compile 和build 时都没问题,能运行

但在BuildExecute时,输入第一个数后,就显示该内存为只读而跳出,

请斑竹帮帮忙,给个解决方案

bCQD3rF4.rar (1.43 KB) [求助]请版主帮忙看看这个问题

[此贴子已经被作者于2005-10-7 13:41:58编辑过]

搜索更多相关主题的帖子: 链表 版主 point node head 
2005-10-07 13:31
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
我还上传了个附件,怎么没了?

我的征途是星辰大海
2005-10-07 13:34
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 
呵呵,我不是斑竹,我是来问问题的,
typedef struct node *point;
struct node
{
int data;
point next;
};
也可以写成       typedef struct node{    int data;
                                                             struct node *next;
                                                         }node,*point;
对吗?
问:node 和 *point 分别指什么啊,为什么要定义两个,不明白呢?
我基本的概念模糊,自己又找不到答案

2005-10-09 11:25
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 

typedef struct node { char name[20]; struct node *llink,*rlink; }stud;

void print(stud *h) { int n; stud *p; p=h->rlink; printf("数据信息为:\n"); while(p!=h) { printf("%s ",&*(p->name));---------怎么又是取址又是指针的啊,好困惑 p=p->rlink; } printf("\n"); }


2005-10-09 11:29
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 
main() { int number; char studname[20]; stud *head,*searchpoint; number=N; clrscr(); head=creat(number); print(head); printf("请输入你要查找的人的姓名:"); scanf("%s",studname); searchpoint=search(head,studname); printf("你所要查找的人的姓名是:%s\n",*&searchpoint->name);---这个更奇怪,跟刚刚那个顺序 正好相反,郁闷,救命啊! del(searchpoint); print(head); }

[此贴子已经被作者于2005-10-9 11:32:05编辑过]


2005-10-09 11:30
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 
84431319,加我QQ

2005-10-09 11:51
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 

void Insert(point p,int x)//按升序插入数据,允许有重复数据 { point q,r; q=p->next; while(q && q->data<x) { p=p->next; q=q->next; } r=(struct node *)malloc(sizeof(struct node)); if(!r) printf("分配失败"); r->data=x; r->next=q; p->next=r;-----------------r的前驱指针你忘了写! if(!q) { r->next=NULL; p->next=r; }-----------少括号! }

point creat()//任意顺序输入数据,建立升序链表 { int x; point p; point head;

head=(struct node *)malloc(sizeof(struct node)); if(!head) printf("分配失败/n"); p=head; printf("请输入数字:"); scanf("%d",&x); while(x!=0) { Insert(head,x); printf("请输入数字:"); scanf("%d",&x); } printf("您输入的数据为: "); print(head); return head; }

[此贴子已经被作者于2005-10-10 11:19:58编辑过]


2005-10-10 11:16
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 

把你的程序改后,成功了! 不过我喜欢这样定义参数,并且把链表设为是有头节点的,这样即便是尾插入表也不用担心啦,操作都一样。 void Insert(point h,int x) { point p,q,s; --------q是当前指针,p是前一个指针,s是插入指针 p=h->next; q=h; while(p&&p->data<x) { p=p->next; q=q->next; } s=(struct node *)malloc(sizeof(node)); if(!s) printf("分配失败"); s->data=x; q->next=s;

s->next=p; if(!p) { s->next=NULL; q->next=s;} }

point creat() { int x; point p; point head;

head=(struct node *)malloc(sizeof(struct node)); if(!head) printf("分配失败/n"); head->data='\0';--------------定义头结点 head->next=NULL; p=head; printf("input numbers"); scanf("%d",&x); while(x!=0) { Insert(head,x); printf("input number"); scanf("%d",&x); } printf("\nwhat you put is"); print(head); return head; }

还有 head=(struct node *)malloc(sizeof(struct node)); 也可以写成 head=(struct node *)malloc(sizeof(node));同样也能编译成功!

[此贴子已经被作者于2005-10-10 19:16:25编辑过]


2005-10-10 11:23
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
    我想问问楼住。你的程序你是全部写出来。在来测试。还是写一步功能就测试一步。我看了都晕了

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-10-11 09:48
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 

楼主。你变量竟然不初始化就直接用。还有你写程序的时候。你不要全部功能写出来后在来测试。如果出了错误很难改的。我建议你写一步功能就测试一步。那样比较容易完成长的程序。我帮你改好了建立的功能。其他功能你自己慢慢来。 #include <stdio.h> #include <malloc.h> typedef struct node *point; struct node { int data; point next; };

void print(point head)//输出链表 { point p; p=head->next; while(p != NULL) { printf("%d -> ",p->data); p=p->next; } printf("NULL\n"); }

void revers(point head)//链表逆转置 { point p,q,r; p=head->next; q=p->next; r=q->next; if(p==NULL || q==NULL) printf("该链表无须转置。"); p->next=NULL; p=q; while(r->next) { q=r; r=r->next; q->next=p; p=q; } r->next=p; head->next=r; }

point Insert(point p,int x)//按升序插入数据,有重复数据 { point head, q,r; head = p; q = p->next; while(q != NULL && q->data<x) { p=p->next; q=q->next; } r=(struct node *)malloc(sizeof(struct node)); if(!r) printf("分配失败"); r->data=x; r->next=NULL; if(q == NULL) p->next = r; else { r->next=q; p->next = r; } return head; }

point creat()//任意顺序输入数据,建立升序链表 { int x; point p; point head;

head=(struct node *)malloc(sizeof(struct node)); head->next= NULL; if(!head) printf("分配失败/n"); p=head; printf("请输入数字:"); scanf("%d",&x); while(x!=0) { head=Insert(head,x); fflush(stdin);//在此加上清流函数 printf("请输入数字:"); scanf("%d",&x); } printf("您输入的数据为: "); print(head); return head; }

void Delet(point head,int x)//删除所有x { int i=0; point p; point q; point r; p=head; q=p->next; r=NULL; while(q) { if(q->data==x) { p->next=q->next; r=q; q=q->next; free(r); i++; } else { p=p->next;q=q->next; } } if(i==0) printf("输入的数不存在。"); else { printf("删除后链表变成:"); print(head); } }

/*void choose(point head) { int x; printf("a. 插入一个数据/n"); printf("b. 删除一个数据/n"); printf("c. 将该链表逆转置/n"); printf("d. 退出程序/n"); printf("请选择操作:/n"); char grade; grade=getchar(); if (grade=='a'||grade=='A') { printf("请输入要插入的数据:"); scanf("%d",&x); Insert(head,x); printf("插入后链表变成:"); print(head); choose(head); } else if (grade=='b'||grade=='B') { printf("请输入要删除的数据:"); scanf("%d",&x); Delet(head,x); printf("删除后链表变成:"); print(head); choose(head); } else if (grade=='c'||grade=='C') { printf("逆转置前链表为:"); print(head); revers(head); printf("逆转置后链表为:"); print(head); } else if (grade=='d'||grade=='D'); else { printf("输入错误,请重新选择:/n"); choose(head); } }*/

void main() { point head; head=creat(); //choose(head); }


生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-10-11 10:15
快速回复:[求助]请版主帮忙看看这个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024786 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved