求c语言链表编程
发布网友
发布时间:2022-04-22 03:23
我来回答
共3个回答
热心网友
时间:2024-02-23 16:46
简单写了个!!看看运行一下
#include<iostream>
#include<conio.h>
using namespace std;
#define LENGTH 20
#define OK 1
#define ERROR 0
typedef long LElemType; /*学号变量类型*/
typedef int IElemType; /*成绩变量类型*/
typedef char CElemType;
typedef int Status; /*返回值的类型*/
typedef struct student
{
LElemType num;
CElemType name[LENGTH];
CElemType sex[LENGTH];
IElemType age;
student *next;
}node;
typedef struct LIST
{
node *head,*tail;
}link;
Status Init(link *s)
{
s->head = s->tail = (node *)malloc(sizeof(node)); /*头结点*/
if(NULL == s->head)
{
cout<<"分配失败!"<<endl;
return ERROR;
}
s->head->num = 0; /*头节点的学号用来放置节点个数*/
s->head->next = NULL;
return OK;
}
node *MakeNode(int i) /*生成存放学生信息的节点*/
{
node *p=(node *)malloc(sizeof(node));
cout<<"请输入第"<<(i+1)<<"个学生的信息: ";
cin>>p->num>>p->name>>p->sex>>p->age;
p->next = NULL;
return p;
}
Status Insert(link *s,int n)
{
for(int i=0; i<n; i++) /*录入n个学生的信息*/
{
node *p = MakeNode(i);
s->tail->next = p;
s->tail = p;
s->head->num++; /*修改头结点中存放学生信息条数每增加一个节点就要++1*/
}
return OK;
}
Status display(link *s)
{
node *p = s->head->next; /*让p指针指向头结点的下一个节点,因为头结点只用来存放了学生的人数*/
if(!p)
{
cout<<"还没有学生信息!"<<endl;
return ERROR;
}
while(p)/*只要p指针指向不为空就要输出*/
{
cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->age<<endl;
p = p->next;
}
return OK;
}
Status SortByNum(link *s) /*按照学号升序排序*/
{
int n = s->head->num;
node *p,*cur,*next;
for(int i=0; i<n-1; i++)
{
p= s->head;
cur=p->next;
next = cur->next;
for(int j=0; j<n-1-i; j++)
{
if(next->num<cur->num)
{
p->next=next; /*若前面的大于后面的就要交换前后两个值*/
cur->next = next->next;
next->next = cur;
p=next; /*交换之后要修改当前指针与当前指针与下一个指针的位置*/
next=cur->next;
}else{ /*挨着的两个值,前面的不大于后面的只要将指针往后面移动*/
p=cur;
cur = next;
next = next->next;
}
}
}
return OK;
}
Status DeleteStu(link *s,long *num)
{
if(s->head->next==NULL)
{
cout<<"没有任何学生信息记录"<<endl;
return ERROR;
}
else
{
cout<<"请输入你要删除的学生的学号:";
cin>>*num;
node *cur,*p;
cur = s->head;
while(cur->next)
{
if(cur->next->num == *num)
{
break;
}
else{
cur = cur->next;
}
}
if(cur->next)
{
p = cur->next;
cur->next = p->next;
p->next = NULL;
free(p);
s->head->num--;
return OK;
}else{
cout<<"不存在该学生的信息"<<endl;
return ERROR;
}
}
}
Status QueryStu(link *s,long num)
{
node *p = s->head->next; /*让p指针指向头结点的下一个节点,因为头结点只用来存放了学生的人数*/
if(!p)
{
cout<<"还没有学生信息!"<<endl;
return ERROR;
}
while(p)/*只要p指针指向不为空就要输出*/
{
if(p->num==num)
{
cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->age<<endl;
break;
}
p = p->next;
}
cout<<"没有该学生信息!"<<endl;
return OK;
}
Status Menu()
{
int k=-1;
while(k<1||k>5){
system("cls");
cout<< " 学生信息管理程序实现\n"
" 1、学生信息的录入 \n"
" 2、学生信息的显示 \n"
" 3、学生信息的查询 \n"
" 4、学生信息的删除 \n"
" 5、系统推出 \n\n\n";
if(k==-1)
{
cout<<"请选择功能:";
}else if(k<1 || k>5)
{
cout<<"(选择错误)请重新选择:"<<endl;
}
fflush(stdin);
scanf("%d",&k);
}
return k;
}
int main()
{
link s;
int n=0,k=-1;
long num;
Init(&s);
do{
switch(k=Menu())
{
case 1:
cout<<"你想录入多少学生的记录:n=";
fflush(stdin);
scanf("%d",&n);
if(n!=0)
{
Insert(&s,n);
cout<<n<<"个学生信息录入完毕...";
}
else{
cout<<"输入学生个数要大于0的正整数...";
}
getch();
break;
case 2:
puts("所有学生的信息: \n");
SortByNum(&s);
display(&s);
cout<<"所有信息显示完毕...";
getch();
break;
case 3:
cout<<"输入要查询学生的学号:";
cin>>num;
QueryStu(&s,num);
getch();
break;
case 4:
if(DeleteStu(&s,&num))
{
cout<<"删除操作成功...";
}
else{
cout<<"删除操作失败...";
}
getch();
break;
case 5:
cout<<"成功退出了系统"<<endl;
exit(0);
break;
default:
break;
}
}while(k!=5);
return OK;
}
热心网友
时间:2024-02-23 16:47
#include <iostream>
#include <conio.h>
#include <fstream>
using namespace std;
struct student{
int Number;
int Age;
char Sex;
string name;
};
//线性表
struct List{
student data[10];
int last;
};
//线性表初始化
bool Initialize_List( struct List &L ){
L.last = 0;
return true;
}
//添加元素
bool Add_Item( struct List &L ){
system("cls");
cout<<"1>增加元素!\n输入学生学号:";
cin>>L.data[L.last].Number;
cout<<"\n输入学生性别(F or M):";
cin>>L.data[L.last].Sex;
cout<<"\n输入学生姓名:";
cin>>L.data[L.last].name;
cout<<"\n输入学生年龄:";
cin>>L.data[L.last].Age;
L.last++;
return true;
}
//删除元素
string Delete_Item( struct List &L){
system("cls");
int pos;
cout<<"2>删除元素!\n输入位置:";
cin>>pos;
for( pos--; pos <= L.last-1; pos++){
L.data[pos] = L.data[pos+1];
}
L.last--;
return "Sucessfully Delete!";
}
//查看学生
void View_Data( struct List &L ){
system("cls");
int pos;
pos--;
cout<<"3>查看学生\n输入位置:";
cin>>pos;
if( pos >= L.last){
cout<<"\n不存在!";
getch();
return;
}
cout<<"学号\t性别\t名字\年龄"<<endl;
cout<<L.data[pos].Number<<"\t"
<<L.data[pos].Sex <<"\t"
<<L.data[pos].name <<"\t"
<<L.data[pos].Age <<endl;
getch();
}
//查看全部
void View_All( struct List &L ){
system("cls");
if( !L.last ){
cout<<"NULL";
return;
}
cout<<"4>查看全部\n序号\t性别\t名字\t年龄\n";
for( int pos = 0; pos<L.last; pos++ ){
cout<<L.data[pos].Number<<"\t"
<<L.data[pos].Sex <<"\t"
<<L.data[pos].name <<"\t"
<<L.data[pos].Age <<"\n";
if( !(pos+1)%10 ) getch();
}
getch();
}
//保存
void List_Save( struct List &L ){
system("cls");
cout<<"5>保存!\n";
ofstream ofile;
ofile.open( "List.txt" );
ofile<<L.last<<endl;
for( int pos=0; pos<L.last; pos++){
ofile<<L.data[pos].Number<<"\t"
<<L.data[pos].Sex<<"\t"
<<L.data[pos].name<<"\n";
}
ofile.close();
cout<<"Save Sucessgully!"<<endl;
getch();
}
//读取
bool List_Read( struct List &L ){
ifstream ifile;
ifile.open( "List.txt" );
if( ifile>>L.last ){
for( int pos=0; pos<L.last; pos++){
ifile>>L.data[pos].Number
>>L.data[pos].Sex
>>L.data[pos].name
>>L.data[pos].Age;
}
}
else return false;
ifile.close();
return true;
}
int main(){
int key=0;
List L;
if( !List_Read( L ) )
if( Initialize_List( L ) ){
cout<<"Initialize List OK!";
getch();
}
while( key != 27 ){
system("cls");
cout<<"\n\t1>增加元素!"<<endl;
cout<<"\n\t2>删除元素!"<<endl;
cout<<"\n\t3>删除全部!"<<endl;
cout<<"\n\t4>查看学生!"<<endl;
cout<<"\n\t5>查看全部!"<<endl;
cout<<"\n\t6>保存文件!"<<endl;
cout<<"\n\t7>退出。" <<endl;
key = getch();
switch(key){
case 49:
if( Add_Item( L ) ){
cout<<"Add Sucessfully!";
} break;
case 50:
cout<<Delete_Item( L ); break;
case 51:
Initialize_List( L ); break;
case 52:
View_Data( L ); break;
case 53:
View_All( L ); break;
case 54:
List_Save( L ); break;
case 55:
case 27: return 1;
}
}
return 1;
}
热心网友
时间:2024-02-23 16:47
这个在c++有stack 这个堆栈就是链栈