哥们你这是数据结构上的吧。。。。。。学数据结构要灵活。。。。。
创新互联IDC提供业务:达州主机托管,成都服务器租用,达州主机托管,重庆服务器租用等四川省内主机托管与主机租用业务;数据中心含:双线机房,BGP机房,电信机房,移动机房,联通机房。
这里给你一个建立链表的程序:(以SDUTOJ 2116题为例题)
#include iostream
using namespace std;
class List
{
public:
int data;//数据域,用来记录数据
List *next;//指着域,用来记录它下一个节点的地址
//访问这个变量能找到它的下一个节点
};
void del(List *p)//递归释放内存
{
if(p == NULL)//p为NULL说明p访问到链表结尾了
return ;//访问到结尾返回
del(p-next);//如果没访问到结尾,会在这里一直调用函数本身递归,直到遇见NULL
delete p;//遇到NULL返回到head的时候,从后向前删除节点,释放内存
//如果从前面删除的话就会把本节点的next值也给删除了,就没办法访问到下一个节点了
//如果定义一个临时变量先记录下一个节点地址然后再删除本节点也是可以解决这个问题的
}
//void del(List *head)
//{
// List *p = head,*q;
// while(p)
// {
// q = p;
// p = p-next;
// delete q;
// }
//}//这样释放内存也是可以的
int main()
{
List *head = new List;//new开辟内存,地址赋给head,head代表这个
//链表的头,访问head能找到这个链表
head-next = NULL;//初始状态下只有head链节,他没有后继结点,所以他的next值为NULL(空)
List *p,*q;//p是游动指针,建立链表的时候永远指向最后一个链节
//q是开新内存用的,也就是增加一个新的链节
int n;//输入数的个数
cinn;
p = head;//初始状态下只有head一个链节,那么最后一个链节也是head,让p指向head
for(int i = 0;i n;i++)
{
q = new List;//增加新的链节q
cinq-data;//给新链节的data赋值
p-next = q;//把q挂在p(初始值是head)的后面
q-next = NULL;//新链节是链表的最后一个链节,后面没有后继,那么,就把他的next值设为NULL(空)
p = q;//q成为p的后继之后,q就是最后一个节点,我们规定p指向最后一个节点,这里就把q赋给p
}//循环完成后,链表就建立完了,head是他们的头
p = head-next;//p在上面是指向最后一个元素,以便于增加新的链节后能很快的放在它的后面,达到添加链节的目的
//现在我们就发动他的游动特点,来访问整个链表,从上面看来,我们输入的第一个整数放在q-data
//里面了,并没有放在head里面,那么,我们访问的话,head的下一个节点才是第一个存储节点,用p
//访问head的next,判就指向了链表中的第一个存储输入数的节点(真正第一个节点是head,因为head
//因为head的data没有值,所以,我们说head的后面第一个节点为有效节点)
while(p != NULL)//当p访问不到NULL的时候,就会一直循环,NULL是链表结束的标志
{
coutp-data;//输出p访问到的每个节点的data值
if(p-next != NULL)
cout" ";//这两行是调格式的,为了能在最后不多输出空格,其实只是为了在OJ上AC
p = p-next;//p访问把本节点的next值,p就指向下一个节点,相当于向后移动一个节点
}
coutendl;
del(head);//释放内存
return 0;
}
根据我对你的 C 语言源代码的分析,你的源程序中只提供了如下子函数:(1)、计算链表长度:getlen( );(2)、删除链表指定元素:delete( );(3)、在链表中插入一个指定元素:insert( ) ;(4)、遍历整个链表:list( )。
而关于到底如何创建一个新链表,你的这个 C 语言源程序代码中并没有写出来。而 C 语言中功能最最强大的、同时并且最最难于调试的代码就是:指针!!而一旦指针再用于对链表的各种操作中(创建、插入、删除、遍历等),如果没有丰富的 C 语言编程经验的话,那要想调试通过一个对链表的各种操作,就更是:难上加难。
所以我个人的建议还是:你必须要亲自仔细阅读《数据结构》C语言版的教材,而且最最重要的就是:一定要亲自上机编写、并调试链表程序源代码才行!别人很难于给你马上就写出来一个正确的、可以执行的链表源代码。这就是我当时学习数据结构、以及 C 语言指针的亲身体会。
main可以建立两个多项式,相加后得到另一个多项式。并输出这三个多项式。然后释放链表空间。结束程序。
1、添加头文件"stdio.h"
2、struct student * creat(void),但是你的main函数中返回接收却是用的int*类型。
3、主函数main应当明确声明为void main()
4、最为严重的是:struct student * creat(void) 函数体中使用了局部变量struct student *head; struct student *p1,*p2; 但是函数结束的地方却要返回这些指针,因此返回的值是无效数据。返回时,已经不再作用域了,是无效的空间。建议把这些数据当作输入参数,指针类型的。就可以正确的接收分配的struct student空间以及指针了。
5、struct student * creat(void) 函数体中,临时指针*p1、*p2再函数返回之前应当设置为NULL,避免因为局部变量的作用域结束导致相关的空间被清除。
总之,我建议把struct student * creat(void)定义修改为:
void creat(struct student **head).
以上内容经过调试,可以使用。
==================我的程序,经过完整的调试
#include "stdafx.h"
#include "malloc.h"
#include "stdio.h"
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student *next;
};
int n;
void creat(struct student **head) /*定义函数,此函数带回一个指向链表头的指针*/
{
struct student *p1,*p2;
n=0;
do
{
p1=(struct student *)malloc(LEN); /*开辟一个新单元*/
p1-next=NULL;
scanf("%ld,%f",p1-num,p1-score);
if(p1-num==0)
break;
n++;
if(n==1)
*head=p1;
else
p2-next=p1;
p2=p1;
} while(p1-num!=0) ;
p1=NULL;
p2=NULL;
}
void main()
{
struct student *p;
creat(p);
if(p!=NULL)
do
{
printf("%ld %5.1f\n",p-num,p-score);
p=p-next;
}while(p!=NULL);
flushall(); //清除键盘缓冲区,避免输入混淆
getchar(); //等待键盘任意输入,以便观察运算结果
}
看我的回答怎么样?