c语言链表问题求解,详细的话加分

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言链表问题求解,详细的话加分相关的知识,希望对你有一定的参考价值。

插入函数:输入三个数: (编号1,编号2,成绩)
使在编号1的结点后面插入一个结点

第一次运行无问题,但是为什么第二次输入数据时就会无响应?求指正

#include <stdio.h>
#include <stdlib.h>
#define format "%5d %6.1lf \n"
#define LEN sizeof(struct s)
struct s
int num;
double score;
struct s *next;
a,b,c;

int n=3;
/*插入函数2*/
struct s * insert2(struct s *head ,int x,struct s *sh2)
struct s *p0,*p;
p0=sh2;
p=head;
while((p->next!=NULL)&&(p->num!=x))
p=p->next;
if((p->next==NULL)&&(p->num!=x))
printf(" %d not been found!\n",x); return(head);
else
p0->next=p->next; p->next=p0;
n++; return(head);

/*输出函数*/
void print(struct s *head)
struct s *p;
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printf("\nNOW,these %d records are :\n",n);
p=head;
do
printf(format,p->num,p->score);
p=p->next;
while (p!=NULL);
printf("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printf("\7\7");

void main()
struct s *head,*sh2,*sh; int x=1;
a.num=10000;a.score=99;
b.num=10010;b.score=0;
c.num=10086;c.score=59;
head=&a; a.next=&b;b.next=&c;c.next=NULL;
print(head);
/*插入操作2*/
sh2=(struct s *)malloc(LEN);
printf("\ninsert2 :");
scanf("%d,%d,%lf",&x,&sh2->num,&sh2->score);
while(x!=0)

head=insert2(head,x,sh2);
print(head);
sh2=(struct s *)malloc(LEN);
printf("\ninsert2 :");
scanf("%d,%d,%lf",&x,sh2->num,sh2->score);

参考技术A #include <stdio.h>
#include <stdlib.h>
#define format "%5d %6.1lf \n"
#define LEN sizeof(struct s)
struct s
int num;
double score;
struct s *next;
a,b,c;

int n=3;
/*插入函数2*/
struct s * insert2(struct s *head ,int x,struct s *sh2)
struct s *p0,*p;
p0=sh2;
p=head;
while((p->next!=NULL)&&(p->num!=x))
p=p->next;
if((p->next==NULL)&&(p->num!=x))
printf(" %d not been found!\n",x); return(head);
else
p0->next=p->next; p->next=p0;
n++; return(head);

/*输出函数*/
void print(struct s *head)
struct s *p;
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printf("\nNOW,these %d records are :\n",n);
p=head;
do
printf(format,p->num,p->score);
p=p->next;
while (p!=NULL);
printf("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printf("\n\n");

void main()
struct s *head,*sh2,*sh; int x=1;
a.num=10000;a.score=99;
b.num=10010;b.score=0;
c.num=10086;c.score=59;
head=&a; a.next=&b;b.next=&c;c.next=NULL;
print(head);
/*插入操作2*/
sh2=(struct s *)malloc(LEN);
printf("\ninsert2 :");
scanf("%d,%d,%lf",&x,&sh2->num,&sh2->score);
while(x!=0)

head=insert2(head,x,sh2);
print(head);
sh2=(struct s *)malloc(LEN);
printf("\ninsert2 :");
scanf("%d,%d,%lf",&x,&sh2->num,&sh2->score); //这里少了取地址符

本回答被提问者采纳

C语言写的链表。明明没有错误,为啥编译器还会报错,?而且还爆出100+的错误,求解。

太长没有办法发过来,http://tieba.baidu.com/p/2077544469百度贴把的连接

参考技术A 就是前面和后面有点问题,直接用下面的替换掉对应的部分就行了。
你去私信里复制代码吧,私信里复制粘贴后不是一整行。

#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
/*-----------------------------------数据类型定义----------------------------------------*/
typedef struct node

int data; //链表结构,链表的数据域
struct node *next; //链表的结构,链表的指针域
LINKLIST;
LINKLIST * set(); //声明将要用到的建立链表的函数
void insert(LINKLIST*); //这里声明了一个插入添加数据的函数!!!声明一个带有参数的函数的时候记得传递参数!
void output(LINKLIST*); //声明一个输出函数
void del(LINKLIST*); //删除一个数据的声明
void alter(LINKLIST*); //修改一个结点的数据
void select(LINKLIST*); //查询某个位置的数据
void select1(LINKLIST*); //高级查询,查询数据所在的位置
/*------------------------------------主函数----------------------------------------*/
void main() //主函数
...............................
...............................
...............................
...............................
/*---------------------------------------------查询某个结点在哪几个位置上出现---------------------------------------------*/
void select1(LINKLIST *SQ)

LINKLIST *q;
LINKLIST *p;
q = (LINKLIST*)malloc(sizeof(LINKLIST));
p = (LINKLIST*)malloc(sizeof(LINKLIST));
p->data = -1;
q = p;
printf("Please input the query node data:");
int data;
// int sum[100];
// sum[0] = -1;
scanf("%d",&data);
for(int i = 1,j = 0;SQ->data!=NULL;i++) //如果SQ不是空的则一直检索下去

if(SQ->data == data) //如果检索到相同的就将这个结点的位置保存到sum数组中。

q->data = i;
q = q->next;
//sum[j+1] = sum[j];
//sum[j] = i;
//j++; SQ = SQ->next;
if(p->data == -1) //如果检索完之后sum[0]还是-1那么就输出没有找到


printf("Did not find the same data");

else //否则输出数据

while(p->data!=NULL)

printf("%d",p->data);
p = p->next;

//int j =1;
//while(sum[0]!=-1)
//
// printf("%d\t",sum[j]);
// j++;
//




/*------------------------------------定义插入结点链表函数----------------------------------------*/
LINKLIST *set() //定义插入结点链表函数

printf("please input the integer to inster :\n");
/*Q 是用来返回的头结点,P用来新建结点,Prep用来设置表尾结点。Prep*/
LINKLIST *P,*Q,*Prep;

int x = 0;
Q = (LINKLIST*)malloc(sizeof(LINKLIST)); //为要输入的链表指针定义空间。
Q->data = -1;
Q->next = NULL;
Prep = Q; //把Q给了Prep Q依旧是头结点,以后输入每一次都给Prep赋值。 scanf("%d",&x); //输入要插入的数值。
while(x!=-1)

P = (LINKLIST *)malloc(sizeof(LINKLIST));
P->data = x; //使用P作为一个中转链结点,
P->next = NULL;
Prep->next = P; //链表的最后一个结点的后一个结点为P
Prep = Prep->next; //保证Prep一直是最后。因为每次插入表尾结点都是在最后。
scanf("%d",&x);
P = P->next; //这样的话可以随时释放临时的P结点,节约空间。
Prep->next = NULL; //结点的最后一个为空


free(P);
/*如果没有P = P->next;这里的P不可以释放。
因为当时P的值是给了Prep->next的。
又执行Prep = Prep->next 导致现在得P是链表中的最后一个结点。*/
return(Q);
追问

后一段也发下私信好吗?还有告诉我为什么好吗?那一段出了问题?

倒数第二个函数的大括号那不是刚刚好吗?

追答

不是,已经发了。选择一段代码,然后按Alt+F8,就会帮助对齐代码,这样看就比较清楚了。

追问

问题检查出来了。我用的是C编译的,一开始用的是C++,C++中变量的定义可以在语句的中间,而C却不可以,导致出现了现在的情况。

本回答被提问者采纳
参考技术B 会不会是编译器的版本不同啊 你写的是哪个版本的C语言追问

一开始的时候编译好好的,就是这个代码,后来我想放到每个头文件一个函数,结果没弄好,我又把各个函数拷贝回来,当时没有做备份,然后就悲剧了,换了VS2008编译也不能。
我这里还有编译成功的exe文件可以运行呢

以上是关于c语言链表问题求解,详细的话加分的主要内容,如果未能解决你的问题,请参考以下文章

C语言写的链表。明明没有错误,为啥编译器还会报错,?而且还爆出100+的错误,求解。

编写C语言程序创建一个具有10个结点的单链表并输出该链表的数据

如何学好C语言的数据结构与算法?

C语言编程问题

数据结构双向链表的介绍和基本操作(C语言实现)保姆级别详细教学

C语言中如何从TXT文件中读出数据并存放到线性链表中