#include<stdio.h> #include<iostream> using namespace std; #define MAX 100 typedef struct STU{ char name[20]; char sno[20]; int age; float score; }Student; typedef struct LNode{ Student data; struct LNode *next; }LNode,*LinkList; //初始化(带头结点的单链表) int InitList(LinkList &L){ L=new LNode; L->next=NULL; return 1; } //判断链表是否为空 int ListEmpty(LinkList L){ if(L->next=NULL){ return 1;//链表为空 }else{ return 0;//链表非空 } } //获取链表长度 int ListLength(LinkList L){ int length=0; struct LNode *p; p=L->next; while(p){ p=p->next; length++; } return length; } //遍历链表 void TraveList(LinkList L){ struct LNode *p; p=L->next; printf("链表结构如下:\n"); while(p){ printf("%s %s %d %.2f",p->data.name,p->data.sno,p->data.age,p->data.score); printf("\n"); p=p->next; } } //插入操作 int ListInsert(LinkList &L,int location,Student &e){ //在链表L的location位置插入元素e struct LNode *p; int j=0; p=L; while(p&&j<location-1){ p=p->next; ++j; } if(!p||j>location-1){ return 0; } struct LNode *s; s=new LNode; s->data=e; s->next=p->next; p->next=s; return 1; } //删除操作 int ListDelete(LinkList &L,Student &e){ //删除L中location位置的元素,并用e返回其值 struct LNode *p; int j=0; p=L; while(p->next&&j<location-1){ p=p->next; ++j; } if(!(p->next)||j>location-1){ return 0; } struct LNode *q; q=new LNode; q=p->next; p->next=q->next; e=q->data; delete q; return 1; } //头插法法创建单链表 void CreateList1(LinkList &L,int n){ //创建长度为n的单链表 L=new LNode; L->next=NULL; printf("请输入链表元素;\n"); for(int i=n;i>0;--i){ printf("请输入第%d个元素值:\n",i); struct LNode *p; p=new LNode;//生成新结点 //输入 printf("请输入姓名:"); scanf("%s",p->data.name); printf("请输入学号:"); scanf("%s",p->data.sno); printf("请输入年龄:"); scanf("%d",&p->data.age); printf("请输入成绩:"); scanf("%f",&p->data.score); p->next=L->next; L->next=p; } } //尾插法创建单链表 void CreateList2(LinkList &L,int n){ L=new LNode; L->next=NULL; struct LNode *r; r=L; printf("请输入链表元素值:\n"); for(int i=0;i<n;i++){ struct LNode *p; p=new LNode; printf("请输入第%d个元素的值:\n",i+1); printf("请输入姓名:"); scanf("%s",p->data.name); printf("请输入学号:"); scanf("%s",&p->data.score); p->next=NULL; r->next=p; r=p; } } int main(){ LinkList L; printf("1.初始化链表\n"); printf("2.创建链表\n"); printf("3.插入操作\n"); printf("4.删除操作\n"); printf("0.退出\n"); int choose=-1; while(choose!=0){ printf("请选择操作:\n"); scanf("%d",&choose); switch(choose){ case 1:{ if(InitList(L)){ printf("链表初始化成功!\n"); }else{ printf("链表初始化失败!\n"); } break; } case 2:{ printf("1.头插法创建单链表\n"); printf("2.尾插法创建单链表\n"); printf("请选择操作:\n"); int choose1; scanf("%d",&choose1); switch(choose1){ case 1:{ printf("请输入链表长度:\n"); int n; scanf("%d",&n); CreateList1(L,n); TraveList(L); break; } case 2:{ printf("请输入链表长度:\n"); int n; scanf("%d",&n); CreateList2(L,n); TraveList(L); break; } } break; } case 3:{ printf("请输入插入的位置和值:\n"); int location; scanf("%d",&location); Student stu; printf("请输入姓名:"); //char name[20]; scanf("%s",stu.name); printf("请输入学号:"); scanf("%s",stu.sno); printf("请输入年龄:"); scanf("%d",&stu.age); printf("请输入成绩:"); scanf("%f",&stu.score); if(ListInsert(L,location,stu)){ printf("插入成功!\n"); TraveList(L); }else{ printf("插入失败!\n"); } //TraveList(L); break; } case 4:{ printf("请输入要删除的元素的位置:\n"); int location; scanf("%d",&location); Student stu; if(ListDelete(L,stu)){ printf("删除成功!\n"); printf("删除的元素值是:\n"); printf("%s %s %d %.2f\n",stu.name,stu.sno,stu.age,stu.score); TraveList(L); }else{ printf("删除失败!\n"); } //TraveList(L); break; } } } }