1.单链表的基本操作:
#include"stdio.h" #include"stdlib.h" #include"conio.h" int COUNT=0; typedef struct node{ struct node *next; int data; }Lnode,*LinkList; void mainmenu() { printf("************链表操作功能菜单***************\n"); printf("1.插入元素 2.按位置删除 \n"); printf("3.按元素删除 4.按位置查找 \n"); printf("5.按元素查找 6.查看所有元素 \n"); printf("7.查看表长 8.销毁表 \n"); printf("9.按位置替换 10.按元素替换 \n"); printf("11.退出程序 \n"); printf("*******************************************\n"); } void List_Insert(LinkList &L,int i,int e) //插入元素 { LinkList p=L; LinkList s; int j=0; while(p&&j<i-1){p=p->next;++j;} if(!p||j>i-1) {printf("此位置不在允许范围!\n");} else{ s=(LinkList)malloc(sizeof(Lnode)); s->data=e; s->next=p->next ; p->next =s; COUNT++; printf("插入成功!\n"); } } void List_Delete_Pos(LinkList &L,int i) //按位置删除 { LinkList p=L; int j=0; if(i>COUNT) {printf("此位置不在允许范围!\n");} else{ while(j<i-1){p=p->next;++j;} p->next =p->next ->next ; printf("删除成功!\n"); COUNT--; } } void List_Delete_Elem(LinkList &L,int e) //按元素删除 { LinkList p=L,s; int i=0; while(i<COUNT){ s=p; p=p->next;i++; if(p->data ==e){ s->next =s->next->next; printf("删除成功!\n"); COUNT--;i--; } } } void List_Replce_Pos(LinkList &L,int i,int e) { LinkList p=L; int j=0; if(i>COUNT) {printf("此位置不在允许范围!\n");} else{ while(p&&j<i){p=p->next;++j;} p->data =e; printf("替换成功!\n"); } } void List_Replace_Elem(LinkList &L,int e,int a) { LinkList p=L; int i=0; while(i<COUNT){ p=p->next; i++; if(p->data ==e){ p->data=a; printf("位置为%d的元素替换成功!\n",i); } } } void List_Find_Pos(LinkList &L,int i) //查找目标位置的元素 { LinkList p=L; //LinkList s; int j=0; while(p&&j<i){p=p->next;++j;} if(!p||j>i) {printf("此位置不在允许范围!\n");} printf("此位置的元素值为:%d\n",p->data); } void List_Find_Elem(LinkList &L,int e) //按元素查找它对应的位置 { LinkList p=L; int i=0; while(p&&i<COUNT){ p=p->next; i++; if(p->data==e) printf("值为%d的元素的位置为:%d\n",e,i); } } void List_Show_All(LinkList &L) //显示所有的元素 { LinkList p=L; int i=0; //printf("%d\n",p->data); while(i<COUNT) {p=p->next ; i++; printf("第%d个元素:%d\n",i,p->data); } } void List_Show_Length(LinkList &L) //显示链表长度 { printf("线性表长度为:%d\n",COUNT); } void List_Clear(LinkList &L) { LinkList p,s; p=L; int i=1; p=p->next ; while(i<COUNT) { s=p; free(s); p=p->next; i++; } L->next=NULL; COUNT=0; printf("此链表已清空!\n"); } int main() { LinkList L; L=(LinkList)malloc(sizeof(Lnode)); L->next =NULL; loop: mainmenu(); int i,e,x; printf("请输入功能选项的相应序号:\n"); scanf("%d",&x); system("cls"); switch(x) { case 1: printf("请输入要插入元素的位置和要插入的元素的值:\n"); scanf("%d%d",&i,&e); List_Insert(L,i,e); system("pause"); system("cls"); goto loop; break; case 2: printf("请输入要删除元素的位置:\n"); scanf("%d",&i); List_Delete_Pos(L,i); system("pause"); system("cls"); goto loop; break; case 3: printf("请输入要删除的元素的值:\n"); scanf("%d",&e); List_Delete_Elem(L,e); system("pause"); system("cls"); goto loop; break; case 4: printf("请输入要查找元素的位置:\n"); scanf("%d",&i); List_Find_Pos(L,i); system("pause"); system("cls"); goto loop; break; case 5: printf("请输入要查找的元素的值:\n"); scanf("%d",&e); List_Find_Elem(L,e); system("pause"); system("cls"); goto loop; break; case 6: List_Show_All(L); system("pause"); system("cls"); goto loop; break; case 7: List_Show_Length(L); system("pause"); system("cls"); goto loop; break; case 8: List_Clear(L); system("pause"); system("cls"); goto loop; break; case 9: printf("请输入被替代元素的位置和替代元素的值:\n"); scanf("%d%d",&i,&e); List_Replce_Pos(L,i,e); system("pause"); system("cls"); goto loop; break; case 10: printf("请输入被替代元素的值和替代元素的值:\n"); scanf("%d%d",&e,&i); List_Replace_Elem(L,e,i); system("pause"); system("cls"); goto loop; break; case 11: printf("感谢您的使用!!\n"); system("pause"); return 0; default: printf("输入有误!\n"); system("pause"); system("cls"); goto loop; break; } return 0; }
2.双链表的基本操作:
#include"stdio.h" #include"stdlib.h" #include"conio.h" int COUNT=0; typedef struct node{ struct node *prior; struct node *next; int data; }Lnode,*LinkList; void mainmenu() { printf("************链表操作功能菜单***************\n"); printf("1.插入元素 2.按位置删除 \n"); printf("3.按元素删除 4.按位置查找 \n"); printf("5.按元素查找 6.按元素替换 \n"); printf("7.按位置替换 8.查看所有元素 \n"); printf("9.退出程序 10.Joseph问题解决 \n"); printf("*******************************************\n"); } void List_Insert(LinkList &L,int i,int e) //插入元素 { LinkList p=L; LinkList s; int j=0; while(p->next !=NULL&&j<i-1){p=p->next;++j;} if(!p||j>i-1) {printf("此位置不在允许范围!\n");} else{ s=(LinkList)malloc(sizeof(Lnode)); s->data=e; /* s->prior=p->prior; p->prior->next=s; s->next =p; p->prior =s; */ s->next=p->next; p->next =s; COUNT++; printf("插入成功!\n"); } } void List_Delete_Pos(LinkList &L,int i) //按位置删除 { LinkList p=L; int j=0; if(i>COUNT) {printf("此位置不在允许范围!\n");} else{ while(j<i-1){p=p->next;++j;} p->next =p->next ->next ; printf("删除成功!\n"); COUNT--; } } void List_Delete_Elem(LinkList &L,int e) //按元素删除 { LinkList p=L,s; int i=0; while(i<COUNT){ s=p; p=p->next;i++; if(p->data ==e){ s->next =s->next->next; p=s; printf("删除成功!\n"); COUNT--;i--; } } } void List_Replce_Pos(LinkList &L,int i,int e) { LinkList p=L; int j=0; if(i>COUNT) {printf("此位置不在允许范围!\n");} else{ while(p&&j<i){p=p->next;++j;} p->data =e; printf("替换成功!\n"); } } void List_Replace_Elem(LinkList &L,int e,int a) { LinkList p=L; int i=0; while(i<COUNT){ p=p->next; i++; if(p->data ==e){ p->data=a; printf("位置为%d的元素替换成功!\n",i); } } } void List_Find_Pos(LinkList &L,int i) //查找目标位置的元素 { LinkList p=L; //LinkList s; int j=0; while(p&&j<i){p=p->next;++j;} if(!p||j>i) {printf("此位置不在允许范围!\n");} printf("此位置的元素值为:%d\n",p->data); } void List_Find_Elem(LinkList &L,int e) //按元素查找它对应的位置 { LinkList p=L; int i=0; while(p&&i<COUNT){ p=p->next; i++; if(p->data==e) printf("值为%d的元素的位置为:%d\n",e,i); } } void List_Show_All(LinkList &L) //显示所有的元素 { LinkList p=L; int i=0; //printf("%d\n",p->data); while(i<COUNT) { p=p->next; i++; printf("第%d个元素:%d\n",i,p->data); } } void List_Clear(LinkList &L) { LinkList p,s; p=L; int i=1; p=p->next ; while(i<COUNT) { s=p; free(s); p=p->next; i++; } L->next=NULL; COUNT=0; printf("此链表已清空!\n"); } void Joseph(LinkList &L,int start,int num) { LinkList s,p=L; int i,count=1; for(i=1;i<=start;i++) { s=p; p=p->next; } while(COUNT!=0&&L->next!=NULL) { if(count==num){ if(p->next==NULL) { s->next=NULL; printf("%d ",p->data); free(p); s=L; p=L->next; count=1; COUNT--; } else{ s->next =p->next ; printf("%d ",p->data ); free(p); p=s->next; count=1; COUNT--; } } if(L->next !=NULL) { if(p->next==NULL) { s=L; p=L->next; count++; } else { s=p; p=p->next; count++; } } } } int main() { LinkList L; L=(LinkList)malloc(sizeof(Lnode)); L->next =NULL; // L->prior =NULL; loop: mainmenu(); int i,e,x,start,num; printf("请输入功能选项的相应序号:\n"); scanf("%d",&x); system("cls"); switch(x) { case 1: printf("请输入要插入元素的位置和要插入的元素的值:\n"); scanf("%d%d",&i,&e); List_Insert(L,i,e); system("pause"); system("cls"); goto loop; break; case 2: printf("请输入要删除元素的位置:\n"); scanf("%d",&i); List_Delete_Pos(L,i); system("pause"); system("cls"); goto loop; break; case 3: printf("请输入要删除的元素的值:\n"); scanf("%d",&e); List_Delete_Elem(L,e); system("pause"); system("cls"); goto loop; break; case 4: printf("请输入要查找元素的位置:\n"); scanf("%d",&i); List_Find_Pos(L,i); system("pause"); system("cls"); goto loop; break; case 5: printf("请输入要查找的元素的值:\n"); scanf("%d",&e); List_Find_Elem(L,e); system("pause"); system("cls"); goto loop; break; case 6: printf("请输入被替代元素的值和替代元素的值:\n"); scanf("%d%d",&e,&i); List_Replace_Elem(L,e,i); system("pause"); system("cls"); goto loop; break; case 7: printf("请输入被替代元素的位置和替代元素的值:\n"); scanf("%d%d",&i,&e); List_Replce_Pos(L,i,e); system("pause"); system("cls"); goto loop; break; case 8: List_Show_All(L); system("pause"); system("cls"); goto loop; break; case 9: printf("感谢您的使用!!\n"); List_Clear(L); system("pause"); return 0; case 10: printf("目前循环链表中元素的个数为:%d\n请输入开始的编号 start(此编号应小于等于链表中元素个数)以及报数的上限 num:\n",COUNT); scanf("%d%d",&start,&num); printf("输出顺序如下:\n"); Joseph(L,start,num); system("pause"); system("cls"); goto loop; break; default: printf("输入有误!请输入正确序号!!\n"); system("pause"); system("cls"); goto loop; break; } return 0; }
3.循环链表的基本操作:
#include"stdio.h" #include"stdlib.h" #include"conio.h" int COUNT=0; typedef struct node{ struct node *next; int data; }Lnode,*LinkList; void mainmenu() { printf("************链表操作功能菜单***************\n"); printf("1.插入元素 2.按位置删除 \n"); printf("3.按元素删除 4.按位置查找 \n"); printf("5.按元素查找 6.查看所有元素 \n"); printf("7.查看表长 8.销毁表 \n"); printf("9.按位置替换 10.按元素替换 \n"); printf("11.退出程序 12.Joseph问题的解决 \n"); printf("*******************************************\n"); } void List_Insert(LinkList &L,int i,int e) //插入元素 { LinkList p=L; LinkList s; if(L->next==NULL) { if(i==1) { s=(LinkList)malloc(sizeof(Lnode)); s->data=e; s->next=L; p->next =s; COUNT++; printf("插入成功!\n"); } else printf("此位置不在允许范围!\n"); } else{ int j=0; while(p->next!=L&&j<i-1){p=p->next;++j;} if(p==L||j>i-1) {printf("此位置不在允许范围!\n");} else{ s=(LinkList)malloc(sizeof(Lnode)); s->data=e; s->next=p->next ; p->next =s; COUNT++; printf("插入成功!\n"); } } } void List_Delete_Pos(LinkList &L,int i) //按位置删除 { LinkList p=L; int j=0; if(i>COUNT) {printf("此位置不在允许范围!\n");} else{ while(j<i-1){p=p->next;++j;} p->next =p->next ->next ; printf("删除成功!\n"); COUNT--; } } void List_Delete_Elem(LinkList &L,int e) //按元素删除 { LinkList p=L,s; int i=0; while(i<COUNT){ s=p; p=p->next;i++; if(p->data ==e){ s->next =s->next->next; printf("删除成功!\n"); COUNT--;i--; } } } void List_Replce_Pos(LinkList &L,int i,int e) { LinkList p=L; int j=0; if(i>COUNT) {printf("此位置不在允许范围!\n");} else{ while(p->next!=L&&j<i){p=p->next;++j;} p->data =e; printf("替换成功!\n"); } } void List_Replace_Elem(LinkList &L,int e,int a) { LinkList p=L; int i=0; while(i<COUNT){ p=p->next; i++; if(p->data ==e){ p->data=a; printf("位置为%d的元素替换成功!\n",i); } } } void List_Find_Pos(LinkList &L,int i) //查找目标位置的元素 { LinkList p=L; //LinkList s; int j=0; while(p->next!=L&&j<i){p=p->next;++j;} if(p==L||j>i) {printf("此位置不在允许范围!\n");} printf("此位置的元素值为:%d\n",p->data); } void List_Find_Elem(LinkList &L,int e) //按元素查找它对应的位置 { LinkList p=L; int i=0; while(p->next!=L&&i<COUNT){ p=p->next; i++; if(p->data==e) printf("值为%d的元素的位置为:%d\n",e,i); } } void List_Show_All(LinkList &L) //显示所有的元素 { LinkList p=L; int i=0; //printf("%d\n",p->data); while(i<COUNT) {p=p->next ; i++; printf("第%d个元素:%d\n",i,p->data); } } void List_Show_Length(LinkList &L) //显示链表长度 { printf("线性表长度为:%d\n",COUNT); } void List_Clear(LinkList &L) { LinkList p,s; p=L; int i=1; p=p->next ; while(i<COUNT) { s=p; free(s); p=p->next; i++; } L->next=NULL; COUNT=0; printf("此链表已清空!\n"); } void Joseph(LinkList &L,int start,int num) { LinkList s,p=L; int i,count=1; for(i=1;i<=start;i++) { s=p; p=p->next; } while(COUNT!=0) { if(count==num){ if(p->next ==L) { s->next =p->next; printf("%d ",p->data ); free(p); p=L->next; count=1; COUNT--; } else{s->next =p->next ; printf("%d ",p->data ); free(p); p=s->next; count=1; COUNT--; } } if(p->next==L) { s=L;p=L->next;count++; } else{ s=p; p=p->next; count++; } } } int main() { LinkList L; L=(LinkList)malloc(sizeof(Lnode)); L->next =NULL; loop: mainmenu(); int i,e,x,start,num; printf("请输入功能选项的相应序号:\n"); scanf("%d",&x); system("cls"); switch(x) { case 1: printf("请输入要插入元素的位置和要插入的元素的值:\n"); scanf("%d%d",&i,&e); List_Insert(L,i,e); system("pause"); system("cls"); goto loop; break; case 2: printf("请输入要删除元素的位置:\n"); scanf("%d",&i); List_Delete_Pos(L,i); system("pause"); system("cls"); goto loop; break; case 3: printf("请输入要删除的元素的值:\n"); scanf("%d",&e); List_Delete_Elem(L,e); system("pause"); system("cls"); goto loop; break; case 4: printf("请输入要查找元素的位置:\n"); scanf("%d",&i); List_Find_Pos(L,i); system("pause"); system("cls"); goto loop; break; case 5: printf("请输入要查找的元素的值:\n"); scanf("%d",&e); List_Find_Elem(L,e); system("pause"); system("cls"); goto loop; break; case 6: List_Show_All(L); system("pause"); system("cls"); goto loop; break; case 7: List_Show_Length(L); system("pause"); system("cls"); goto loop; break; case 8: List_Clear(L); system("pause"); system("cls"); goto loop; break; case 9: printf("请输入被替代元素的位置和替代元素的值:\n"); scanf("%d%d",&i,&e); List_Replce_Pos(L,i,e); system("pause"); system("cls"); goto loop; break; case 10: printf("请输入被替代元素的值和替代元素的值:\n"); scanf("%d%d",&e,&i); List_Replace_Elem(L,e,i); system("pause"); system("cls"); goto loop; break; case 11: printf("感谢您的使用!!\n"); system("pause"); return 0; case 12: printf("目前循环链表中元素的个数为:%d\n请输入开始的编号 start(此编号应小于等于链表中元素个数)以及报数的上限 num:\n",COUNT); scanf("%d%d",&start,&num); printf("输出顺序如下:\n"); Joseph(L,start,num); system("pause"); system("cls"); goto loop; break; default: printf("输入有误!\n"); system("pause"); system("cls"); goto loop; break; } return 0; }