数据结构上机实验:单链表操作
#include <iostream> #include <malloc.h> using namespace std; typedef struct Node { char c; struct Node *next; }*LinkList,LNode; //初始化单链表h LinkList Init(LinkList &h) { h=(LNode*)malloc(sizeof(LNode)); if(h==NULL) { cout<<"没有足够的内存空间"<<endl; exit(0); } h->next=NULL; return h; } //尾差法插入元素 void InsertNum(LinkList &h,int n) { LinkList r,s; r=h; for(int i=0;i<n;i++) { s=(LNode*)malloc(sizeof(LNode)); r->next=s; cin>>s->c; r=s; } r->next=NULL; } //输出单链表h void outputLinkList(LinkList h) { LinkList p=h->next; while(p!=NULL) { cout<<p->c<<" "; p=p->next; } } //求单链表h的长度 int GetLength(LinkList h) { LinkList p; p=h->next; int count=0; while(p!=NULL) { count++; p=p->next; } return count; } //输出单链表的长度 void outputListLength(LinkList h) { cout<<"当前链表的长度为: "<<GetLength(h)<<endl; } //判断单链表h是否为空表 void Empty(LinkList h) { if (h->next==NULL) cout<<"该链表为空!"<<endl; else cout<<"该链表不为空!"<<endl; } //输出单链表h的第n个元素 void outputNthNum(LinkList h,int n) { int curLen=GetLength(h); if(n<=0||n>curLen) { cout<<"位置输入错误!"<<endl; exit(0); } else { LinkList p=h->next; for(int i=1;i<n;i++) { p=p->next; } cout<<"该链表的第"<<n<<"个元素为: "<<p->c<<endl; } } //输出元素a的位置 void outputNumPosition(LinkList h,char a) { LinkList p=h->next; int position=1; while(p!=NULL) { if(p->c==a) { cout<<"元素"<<a<<"在链表中的位置为 :"<<position<<endl; } p=p->next; position++; } if(position-GetLength(h)>1) cout<<"元素"<<a<<"在链表中不存在!"<<endl; } //在第N个位置上插入元素f void InsertNumOnth(LinkList &h,int n,char a) { int len=GetLength(h); if(n<=0||n>len) { cout<<"位置错误,不能插入!"<<endl; exit(0); } else { LinkList p=h->next; LinkList temp; temp=(LNode*)malloc(sizeof(LNode)); if(n==1) { temp->next=p; h->next=temp; temp->c=a; } else { for(int i=2;i<n;i++) { p=p->next; } temp->next=p->next;//3 p->next=temp; temp->c=a; } } } //删除链表的第n个元素 void deleteNthNum(LinkList &h,int n) { if(n<=0||n>GetLength(h)) { cout<<"删除位置输入错误!"<<endl; exit(0); } else { int j=0; LinkList p=h,q; while(j<n-1&&p!=NULL) { j++; p=p->next; } q=p->next; p->next=q->next; free(q); } } //释放链表 void freeList(LinkList &h) { free(h); } int main() { LinkList h; cout<<"欢迎进入单链表操作程序,本程序提供以下操作:"<<endl; cout<<endl; cout<<"1.初始化链表 2.插入n个元素 3.输出单链表"<<endl; cout<<"4.输出单链表的长度 5.输出链表的第n个元素 6.输出元素a的位置"<<endl; cout<<"7.判断链表是否为空 8.在第n个位置插入元素f 9.删除第n个元素"<<endl; cout<<endl; cout<<"输入数字1~8选择您的操作,输入0退出本系统!(为保证程序顺利运行,已默认执行初始化操作)"<<endl; cout<<"请输入数字:"<<endl; int op; Init(h); while(cin>>op&&op) { switch(op) { case 2: { int n; cout<<"输入n的值:";cin>>n; cout<<"输入插入的n个数的值:"; InsertNum(h,n); cout<<"插入成功!"<<endl; break; } case 3: { cout<<"当前链表为:"; outputLinkList(h); cout<<endl;break; } case 4: { outputListLength(h);break; } case 5: { int n; cout<<"输入n的值:";cin>>n; outputNthNum(h,n);break; } case 6: { char a; cout<<"输入a的值:";cin>>a; outputNumPosition(h,a);break; } case 7: { Empty(h);break; } case 8: { int n;char f; cout<<"输入n的值: ";cin>>n; cout<<"输入f的值: ";cin>>f; InsertNumOnth(h,n,f); cout<<"插入成功!"<<endl; break; } case 9: { int n; cout<<"输入n的值: ";cin>>n; deleteNthNum(h,n); cout<<"删除成功!"<<endl; break; } } } return 0; }
运行: