分享

结构体和链表的简单应用

 changqiong0606 2012-07-15

/*
//对具有student类型的结构数组a的n个记录进行选择排序,输出排序后的结果
#include<iostream>
#include<iomanip>
#include<string.h>
using namespace std;

struct student
{
 char num[8];
 char name[10];
 short grade;
};
student a[5] = {
 {"cs102","zp",78},
 {"cs103","ha",69},
 {"cs104","ls",82},
 {"cs105","gm",72},
 {"cs106","zwy",65}      //注意最后没有";"
};
void output(int n)
{
 cout<<"显示具有student结构的"<<n<<"个记录:"<<endl;
 cout.setf(ios::left);

 for(int i=0;i<n;i++)
 {
  cout<<setw(8)<<a[i].num<<setw(12)<<a[i].name;
  cout<<setw(5)<<a[i].grade<<endl;
 }
 cout<<endl;
}

void range(int n)
{
 int min;
 for(int i=0;i<n-1;i++)
 {
  min = i;
  for(int j=i+1;j<n;j++)
   if(strcmp(a[j].name,a[min].name) < 0)//以名字排序
    min = j;
  if(min != i)
  {
   student x = a[i];
   a[i] = a[min];
   a[min] = x;
  }
 }
}

void main()
{
 output(5);
 range(5);
 output(5);
}
*/
/*
//查找
#include<iostream>
#include<iomanip>
#include<string.h>
using namespace std;

struct student
{
 char num[8];
 char name[10];
 short grade;
};
student a[5] = {
 {"cs102","zp",78},
 {"cs103","ha",69},
 {"cs104","ls",82},
 {"cs105","gm",72},
 {"cs106","zwy",65}      //注意最后没有";"
};
int search(student s[],int n,student x)
{
 for(int i=0;i<n;i++)
  if(strcmp(s[i].num,x.num) == 0)
   return i;
 return -1;
}
void main()
{
 student x={"cs104"};
 int k;
 k = search(a,5,x);
 if(k >= 0)
  cout<<a[k].num<<' '<<a[k].name<<' '<<a[k].grade<<endl;
 else
  cout<<"学号为"<<x.num<<"的记录不存在!"<<endl;
}
*/
/*
//从student结构数组中更新某一给定学号的记录,若更新成功返回1,否则将新记录插入到数组末尾,并
//修改数组长度为已有长度加1,同时返回0表示完成插入。
#include<iostream>
#include<iomanip>
#include<string.h>
using namespace std;

struct student
{
 char num[8];
 char name[10];
 short grade;
};
student a[9] = {
 {"cs102","zp",78},
 {"cs103","ha",69},
 {"cs104","ls",82},
 {"cs105","gm",72},
 {"cs106","zwy",65}      //注意最后没有";"
};
int update(student s[],int& n,const student& x)
{
 for(int i=0;i<n;i++)
  if(strcmp(s[i].num,x.num) == 0)
  {
   s[i] = x;//用x值更新s[i]
   return 1;
  }
 s[n++] = x;//将x值插入到s数组最后一个记录后面
 return 0; 
}
void output(student *s, int n)
{
 cout.setf(ios::left);
 for(int i=0;i<n;i++)
 {
  cout<<i<<' '<<setw(8)<<s[i].num<<setw(12)<<s[i].name;
  cout<<setw(5)<<s[i].grade<<endl;
 }
 cout<<endl;
}
void main()
{
 student x={"cs102","zp",68},y={"cs112","zzp",88};
 int n=5;

 cout<<"学生记录为:"<<endl;
 output(a,n);

 if(update(a,n,x) == 1)
  cout<<"完成更新操作!"<<endl;
 else
  cout<<"完成插入操作!"<<endl;

 if(update(a,n,y) == 1)
  cout<<"完成更新操作!"<<endl;
 else
  cout<<"完成插入操作!"<<endl;
 
 cout<<"学生记录为:"<<endl;
 output(a,n);
}
*/
/*
//查找学生学号,修改成绩
#include<iostream>
#include<iomanip>
#include<string.h>
using namespace std;

struct student
{
 char num[8];
 char name[10];
 short grade;
};
student a[9] = {
 {"cs102","zp",78},
 {"cs103","ha",69},
 {"cs104","ls",82},
 {"cs105","gm",72},
 {"cs106","zwy",65}      //注意最后没有";"
};
student *search(student s[],int n,const student& x)
{
 for(int i=0;i<n;i++)
  if(strcmp(s[i].num,x.num) == 0)
   return &s[i];//返回元素的地址
 return 0;
}
void output(student *s, int n)
{
 cout.setf(ios::left);
 for(int i=0;i<n;i++)
 {
  cout<<i<<' '<<setw(8)<<s[i].num<<setw(12)<<s[i].name;
  cout<<setw(5)<<s[i].grade<<endl;
 }
 cout<<endl;
}

void main()
{
 int n=5;
 student x,*p;
 cout<<"请输入一个待查学生的学号:";
 cin>>x.num;
 p = search(a,n,x);
 if(p !=NULL)
 {
  cout<<p->num<<' '<<p->name<<' '<<p->grade<<endl;
  cout<<"请输入学号为"<<x.num<<"学生的新成绩:";
  cin>>p->grade;
 }
 else
  cout<<"没有找到学号"<<x.num<<"的记录"<<endl;
 output(a,n);
}
*/
/*
#include<iostream>
#include<iomanip>
#include<string.h>
using namespace std;
//下面的函数可以根据从键盘上输入的n个整数建立一个具有n个结点、每个结点为intnode类型的链表
//结点的次序与键盘上输入数值的次序相同,因为每次都是向表尾插入结点的。
struct IntNode
{
 int data;
 IntNode *next;
};
void create(IntNode *& f,int n)
{
 if(n<0)
 {
  cerr<<"n的值无效!"<<endl;
  exit(1);
 }
 if(n == 0)
 {
  f = NULL;
  return;
 }
 cout<<"从键盘上输入"<<n<<"个整数:"<<endl;
 int x;
 cin>>x;
 f = new IntNode;//产生一个动态结点作为表头结点
 f->data = x;f->next = NULL;//建立表头结点
 if(n == 1)
  return;
 IntNode *p=f;//给p赋初值,使之指向刚建立的表头结点
 for(int i=1;i<=n-1;i++)
 {
  cin>>x;
  p->next = new IntNode;//向表尾添加一个结点
  p = p->next;//使p指向新添加的表尾结点
  p->data = x;//把x的值赋给表尾结点
 }
 p->next = NULL;//把整个链表的表尾结点的指针置空
}
//每次向表头插入一个新结点,所以链表中结点的次序正好与键盘上输入的次序相反。
void create1(IntNode *& f, int n)
{
 if(n < 0)
 {
  cerr<<"n的值无效!"<<endl;
  exit(1);
 }
 if(n==0)
 {
  f=NULL;return;
 }
 cout<<"从键盘上输入"<<n<<"个整数:"<<endl;
 int x;
 cin >> x;
 f=new IntNode;
 f->data = x;f->next = NULL;
 if(n == 1)
  return;
 IntNode *p;
 for(int i=1;i<n;i++)
 {
  cin>>x;
  p = new IntNode;
  p->data = x;
  p->next = f;//把f所指向的链表链接到p结点的指针域,相当于把p结点插入到f链表的表头。                  
  f = p;//是f表头指针指向刚刚插入的p结点
 }

}
void traverse(IntNode *f)//遍历由表头指针f所指向的链表
{
 while(f)
 {
  cout<<f->data<<' ';
  f = f->next;
 }
 cout<<endl;
}
void main()
{
 IntNode *head1 = NULL,*head2 = 0;
 int n;
 cout<<"输入结点数:";
 cin>>n;
 create(head1,n);
 traverse(head1);
 create1(head2,n);
 traverse(head2);
}
*/
/*
//联合使用实例
//利用数组保存单位的职工记录,职工包含编号、姓名、性别、类别(1干部,2教师,3工人)和职级。
//       职工记录简表
//编号   姓名   性别   类别   职级
//001   liuminzhu  m    1    chuji
//002   zhaoyang  f    1    keji
#include<iostream>
#include<iomanip>
//#include<string.h>
using namespace std;
struct workers
{
 char num[6];
 char name[12];
 char sex;
 short kind;
 union{
  char cadre[8];
  char teacher[12];
  short worker;
 };
};
void Input(workers a[],int n)
{
 for(int i=0;i<n;i++)
 {
  cout<<"请输入第"<<i+1<<"条记录:"<<endl;
  cin>>a[i].num>>a[i].name>>a[i].sex;
  cin>>a[i].kind;
  switch(a[i].kind)
  {
case 1:
 cin>>a[i].cadre;
 break;
case 2:
 cin>>a[i].teacher;
 break;
case 3:
 cin>>a[i].worker;
 break;
default:
 break;
  }
 }
}
void Output(workers a[], int n)
{
 cout.setf(ios::left);

 cout<<setw(6)<<"num";
 cout<<setw(12)<<"name";
 cout<<setw(5)<<"sex";
 cout<<setw(12)<<"duty"<<endl;

 for(int i=0;i<n;i++)
 {
  cout<<setw(6)<<a[i].num;
  cout<<setw(12)<<a[i].name;
  cout<<setw(5)<<a[i].sex;
  cout<<setw(12);
  switch(a[i].kind)
  {
   case 1:
    cout<<a[i].cadre;
    break;
   case 2:
    cout<<a[i].teacher;
    break;
   case 3:
    cout<<a[i].worker;
    break;
   default:
    break;
  }
  cout<<endl;
 }
}
void Count(workers a[],int n)
{
 int c1,c2,c3;
 c1 = c2 = c3 = 0;
 for(int i=0;i<n;i++)
 {
  switch(a[i].kind)
  {
  case 1:
   c1++;break;  
  case 2:
   c2++;break;
  case 3:
   c3++;break;
  }
 }
 cout<<"cadres:"<<c1<<endl;
 cout<<"teachers:"<<c2<<endl;
 cout<<"workers:"<<c3<<endl;
}
void main()
{
 int n=8;
 workers *a=new workers[n];
 Input(a,n);
 cout<<endl;
 Output(a,n);
 cout<<endl;
 Output(a,n);
 delete []a;
}
*/
//链表
#include<iostream>
//#include<iomanip>
#include<string.h>
#include<stdlib.h>

using namespace std;

struct MixNode
{
 short mark;
 union{
  float f;
  char *r;
 };
 MixNode *next;
};
void Create(MixNode *&,int);
void Traverse(MixNode *);

void main()
{
 MixNode *f;
 int n=6;
 Create(f,n);
 Traverse(f);
}
void Create(MixNode *& head,int n)
{
 if(n<0)
 {
  cerr<<"n的值无效!"<<endl;
  exit(1);
 }
 MixNode *p=new MixNode;
 head=p;
 for(int i=0;i<n;i++)
 {
  p=p->next = new MixNode;
  cout<<"输入结点值类型的标记(1:浮点,2:字符串):";
  cin>>p->mark;
  if(p->mark == 1)
  {
   cout<<"输入一个浮点数:";
   cin>>p->f;
  }
  else
  {
   cout<<"输入一个字符串:";
   char a[20];
   cin>>a;
   p->r = new char[strlen(a)+1];
   strcpy(p->r,a);
  }
 }
 p->next = NULL;
 head = head->next;
}
void Traverse(MixNode *head)
{
 MixNode *p=head;
 while(p!=NULL)
 {
  if(p->mark == 1)
   cout<<p->f<<' ';
  else
   cout<<p->r<<' ';
  p = p->next;
 }
 cout<<endl;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多