如何创建一个链表及相应操作(创建,添加,删除,查询,销毁)
主函数
int main(){
int i,num,n;
list L;
do{
system("cls");
tips();
cout<< "请输入你的选择:";
cin>>num;
switch(num){
case 1:{
create(&L);
cout<<"成功创建一个空链表";
break;
}
case 2:{
cout<<"请输入链表长度"<<endl;
cin>>n;
shurulist(L,n);
break;
}
case 3:{
listall(L);
break;
}
case 4:{
cout<<"请输入你想要查找的元素"<<endl;
cin>>n;
search1(L,n);
break;
}
case 5:{
cout<<"请输入你想要查找的位序"<<endl;
cin>>i;
search2(L,i);
break;
}
case 6:{
listlength(L);
break;
}
case 7:{
cout<<"请输入你想要删除的位序"<<endl;
cin>>i;
listdelete(L,i);
break;
}
case 8:{
cout<<"请输入你想要在第几位加入元素"<<endl;
cin>>i>>n;
listadd(L,i,n);
break;
}
case 9:{
cout<<"请输入你想要查找的元素"<<endl;
cin>>n;
listbefore(L,n);
break;
}
case 10:{
cout<<"请输入你想要查找的元素"<<endl;
cin>>n;
listafter(L,n);
break;
}
case 11:{
listdestroy(L);
break;
}
case 12:{
cout << "操作结束!" << endl;
exit(0);
break;
}
default:
{
cout << "没有该选项,请重新选择。" << endl;
break;
}
}
system("pause");
}while(1);
}
结构体
typedef struct grade{
int score;
struct grade *next;
} grade,*list;
各功能函数实现
创建菜单
void tips(){
cout<<" 可执行的功能"<<endl;
cout<<"****1初始化链表 ****"<<endl;
cout<<"****2初始化并输入链表元素 ****"<<endl;
cout<<"****3输出链表全部元素 ****"<<endl;
cout<<"****4查找链表指定元素位置 ****"<<endl;
cout<<"****5查找链表指定位置元素 ****"<<endl;
cout<<"****6输出链表元素个数 ****"<<endl;
cout<<"****7删除链表第i个元素 ****"<<endl;
cout<<"****8在第i个位置插入元素 ****"<<endl;
cout<<"****9请输入元素,求直接前驱 ****"<<endl;
cout<<"****10请输入元素,求直接后驱 ****"<<endl;
cout<<"****11销毁列表 ****"<<endl;
cout<<"****12退出菜单 ****"<<endl;
}
初始化一个空链表
void create(list *L){
list p;
p=(list)malloc(sizeof(grade));
if(p==NULL)
cout<<"申请内存空间失败"<<endl;
p->next=NULL;
*L=p;
flag++;
}
输入链表元素
void shurulist(list L,int n){
int i;
grade *p,*q;
q=L;
for(i=0;i<n;i++){
p=(list)malloc(sizeof(grade));
if(p==NULL)
cout<<"申请内存空间失败"<<endl;
cout<<"请输入链表第"<<i+1<<"个元素"<<endl;
cin>>p->score;
p->next=q->next;
q->next=p;
q=p;
}
flag++;
}
输出链表元素
int listall(list L){
list p;
p=L->next;
if(p==NULL)
{
cout << "该链表中没有元素。" << endl;
return 1;
}
cout << "链表元素如下:" << endl;
while(p)
{
cout <<p->score<<endl;
p=p->next;
}
return 1;
}
查找链表元素
void search1(list L,int n){
int i=1;
grade *p;
p=L->next;
while(p!=NULL){
if(p->score==n){
cout<<"该元素的位序为"<<i;
break;
}
i++;
p=p->next;
}
if(p==NULL)
cout<<"该元素不存在"<<endl;
}
void search2(list L,int n){
grade *p;
int i=1;
p=L->next;
while(p!=NULL){
if(i==n){
cout<<"该位序的元素为"<<p->score;
break;
}
i++;
p=p->next;
}
if(p==NULL)
cout<<"该位序不存在"<<endl;
}
统计链表元素个数
int listlength(list L){
list p;
int i=0;
p=L;
while(p->next!=NULL)
{
i++;
p=p->next;
}
cout << "链表中共有" <<i<< "个元素" <<endl;
return i;
}
删除链表某个元素
void listdelete(list L,int i){
grade *a,*b;
int j=0;
a=L;
while(a->next!=NULL&&j<i-1){
a=a->next;
j++;
}
b=a->next;
a->next=b->next;
cout<<"删除的元素为"<<b->score<<endl;
free(b);
}
插入链表元素
void listadd(list L,int i,int m){
grade *a,*b;
int j=0;
a=L;
while(a->next!=NULL&&j<i-1){
a=a->next;
j++;
}
b=(list)malloc(sizeof(grade));
if(b==NULL)
cout<<"申请内存空间失败"<<endl;
b->score=m;
b->next=a->next;
a->next=b;
cout << "插入的元素是:"<<m<<endl;
}
求直接前后驱
void listbefore(list L,int i){
grade *p,*q;
int j=0;
q=L;
p=L->next;
while(p->next!=NULL){
if(p->score==i&&j!=0){
cout << "该元素的直接前驱是:"<<q->score<< endl;
break;
}
else if(p->score==i&&j==0){
cout << "该元素没有直接前驱" <<endl;
break;
}
q=p;
p=p->next;
j++;
}
}
void listafter(list L,int i){
grade *p;
p=L->next;
while(p!=NULL){
if(p->score==i){
if(p->next!=NULL)
cout << "该元素的直接后继是:" << p->next->score<<endl;
else
cout << "该元素没有直接后继" << endl;
break;
}
p=p->next;
}
if(p==NULL)
cout<<"该元素不存在"<<endl;
}
链表销毁
int listdestroy(list L){
grade *p;
p=NULL;
if(L&&flag!=0)
{
while(L)
{
p=L;
L=L->next;
free(p);
}
cout << "链表已销毁。" << endl;
}
else
cout << "链表不存在。" << endl;
flag++;
return 1;
}
|