读书人

单向链表有关问题

发布时间: 2013-01-21 10:15:38 作者: rapoo

单向链表问题
求一个单向链表的操作代码。要实现存数据,输出时按从大到小顺序。谢谢,用来学习 不要挖坟和搬砖。
[解决办法]

#include<iostream>
using namespace std;

#define NULL 0
#define LEN sizeof(struct student)

struct student
{
int num; //学号
float score; //分数,其他信息可以继续在下面增加字段
struct student *next; //指向下一节点的指针
};

int n; //节点总数
/*
==========================
功能:创建n个节点的链表
返回:指向链表表头的指针
==========================
*/
struct student *Create()
{
struct student *head; //头节点
struct student *p1 = NULL; //p1保存创建的新节点的地址
struct student *p2 = NULL; //p2保存原链表最后一个节点的地址

n = 0; //创建前链表的节点总数为0:空链表
p1 = (struct student *) malloc (LEN); //开辟一个新节点
p2 = p1; //如果节点开辟成功,则p2先把它的指针保存下来以备后用

if(p1==NULL) //节点开辟不成功
{
printf ("\nCann't create it, try it again in a moment!\n");
return NULL;
}
else //节点开辟成功
{
head = NULL; //开始head指向NULL
printf ("Please input %d node -- num,score: ", n + 1);
scanf ("%d %f", &(p1->num), &(p1->score)); //录入数据
}
while(p1->num != 0) //只要学号不为0,就继续录入下一个节点
{
n += 1; //节点总数增加1个
if(n == 1) //如果节点总数是1,则head指向刚创建的节点p1
{
head = p1;
p2->next = NULL; //此时的p2就是p1,也就是p1->next指向NULL。
}
else
{
p2->next = p1; //指向上次下面刚刚开辟的新节点
}

p2 = p1; //把p1的地址给p2保留,然后p1产生新的节点

p1 = (struct student *) malloc (LEN);
printf ("Please input %d node -- num,score: ", n + 1);
scanf ("%d %f", &(p1->num), &(p1->score));
}
p2->next = NULL; //此句就是根据单向链表的最后一个节点要指向NULL

free(p1); //p1->num为0的时候跳出了while循环,并且释放p1
p1 = NULL; //特别不要忘记把释放的变量清空置为NULL,否则就变成"野指针",即地址不确定的指针


return head; //返回创建链表的头指针
}

/*
===========================
功能:输出节点
返回: void
===========================
*/
void Print(struct student *head)
{
struct student *p;
printf ("\nNow , These %d records are:\n", n);
p = head;
if(head != NULL) //只要不是空链表,就输出链表中所有节点
{
do
{
/*
输出相应的值:当前节点地址、各字段值、当前节点的下一节点地址。
这样输出便于读者形象看到一个单向链表在计算机中的存储结构,和我们
设计的图示是一模一样的。
*/
printf ("%d %5.1f\n", p->num, p->score);
p = p->next; //移到下一个节点
}
while (p != NULL);
}
}

/*
==========================
功能:直接插入排序(由小到大)
返回:指向链表表头的指针
==========================
*/
struct student *InsertSort (struct student *head)
{
struct student *first; //为原链表剩下用于直接插入排序的节点头指针
struct student *t; //临时指针变量:插入节点
struct student *p,*q; //临时指针变量

first = head->next;//原链表剩下用于直接插入排序的节点链表:可根据图12来理解
head->next = NULL;//只含有一个节点的链表的有序链表:可根据图11来理解

while(first != NULL)//遍历剩下无序的链表
{
//注意:这里for语句就是体现直接插入排序思想的地方
for (t = first, q = head; ((q != NULL) && (q->num > t->num)); p = q, q = q->next);//无序节点在有序链表中找插入的位置

//退出for循环,就是找到了插入的位置,应该将t节点插入到p节点之后,q节点之前
//注意:按道理来说,这句话可以放到下面注释了的那个位置也应该对的,但是就是不能。原因:你若理解了上面的第3条,就知道了
//下面的插入就是将t节点即是first节点插入到p节点之后,已经改变了first节点,所以first节点应该在被修改之前往后移动,不能放到下面注释的位置上去
first = first->next;//无序链表中的节点离开,以便它插入到有序链表中

if (q == head)//插在第一个节点之前
{
head = t;
}
else//p是q的前驱
{
p->next = t;
}
t->next = q;//完成插入动作
//first = first->next;
}
return head;
}

int main(void)
{
struct student *head;
struct student *stu;
int thenumber;

// 测试Create()、Print()
head = Create();
Print(head);

//测试InsertSort()
printf("\nInsertSort the LinkList: \n");


head = InsertSort(head);
Print(head);

return 0;
}


[解决办法]
这个是自己刚刚开始学的时候写的一个。。。虽然不是按你的要求,但是可以借鉴借鉴给你啊
文件存贮很简单啊,,,我也就懒的写了啊
写的不满意的地方希望多多包含啊
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
class Person
{
public:
void setName(const string& name){this->name=name;}
void setGender(const string& gender){this->gender=gender;}
void setPnumber(const string& Pnumber){this->Pnumber=Pnumber;}
void setStudy_number(const string& Snumber){this->Snumber=Snumber;}
void setWhere(const string& Where){this->Where=Where;}
string get_name(){return name;}
string get_Gender(){return gender;}
string get_Pnumber(){return Pnumber;}
string get_Snumber(){return Snumber;}
string get_Where(){return Where;}
void print()
{
cout<<"name:"<<name<<endl<<"gender:"<<gender<<endl
<<"Pnumber:"<<Pnumber<<endl<<"Snumber:"<<Snumber<<endl
<<"Where:"<<Where<<endl;

}
Person* next;
private:
string name; //名字
string gender; //性别
string Pnumber;//手机号码
string Snumber;//学号
string Where; //住址
};
Person* get_Person();
void print(Person*);
void freelist_start(Person*);
void save_start(Person*);
int main()
{

Person* start;
start=get_Person();
print(start);
save_start(start);
freelist_start(start);
return 0;
}
Person* get_Person()
{
string name;
string gender;
string Pnumber;
string Snumber;
string Where;
Person *current,*first;
int respons;
current=first=new Person();
cout<<"\nname gender Pnumber Snumber Where";
cin>>name>>gender>>Pnumber>>Snumber>>Where;
current->setName(name);
current->setGender(gender);
current->setPnumber(Pnumber);
current->setStudy_number(Snumber);
current->setWhere(Where);
cout<<"\n ADD ANOTHER?(1==YES,0==NO)";
cin>>respons;
while(respons)
{
current=current->next=new Person();
cout<<"\nname gender Pnumber Snumber Where";
cin>>name>>gender>>Pnumber>>Snumber>>Where;
current->setName(name);
current->setGender(gender);
current->setPnumber(Pnumber);
current->setStudy_number(Snumber);
current->setWhere(Where);
cout<<"\n add another?(1==YES,0==NO)";
cin>>respons;
}

current->next=0;
return first;
}
void print(Person* ptr)
{
int count=1;
cout<<"\n\n\n";
while(ptr!=0)
{
//cout<<"Person number "<<count++<<" is "<<ptr->print()<<'\n';
cout<<count++<<ends;
ptr->print();
cout<<endl;
ptr=ptr->next;
}
}
void save_start(Person* ptr)
{
ofstream outfile;
outfile.open("c:\\1.txt");
Person* temp_ptr;
while(ptr!=0)


{
outfile<<"name:"<<ptr->get_name()<<endl
<<"gender:"<<ptr->get_Gender()<<endl
<<"Pnumber:"<<ptr->get_Pnumber()<<endl
<<"Snumber"<<ptr->get_Snumber()<<endl
<<"Where:"<<ptr->get_Where()<<endl<<endl;
ptr=ptr->next;
}
outfile.close();
}
void freelist_start(Person* ptr)
{
Person* temp_ptr;
while(ptr!=0)
{
temp_ptr=ptr->next;
delete ptr;
ptr=temp_ptr;
}
}

读书人网 >C++

热点推荐