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&&jnext;++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(jnext;++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(inext;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&&jnext;++j;}
p->data =e;
printf("替换成功!\n");
}
}
void List_Replace_Elem(LinkList &L,int e,int a)
{
LinkList p=L;
int i=0;
while(inext; 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&&jnext;++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&&inext;
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(inext ;
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(inext;
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&&jnext;++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(jnext;++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(inext;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&&jnext;++j;}
p->data =e;
printf("替换成功!\n");
}
}
void List_Replace_Elem(LinkList &L,int e,int a)
{
LinkList p=L;
int i=0;
while(inext; 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&&jnext;++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&&inext;
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(inext;
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(inext;
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&&jnext;++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(jnext;++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(inext;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&&jnext;++j;}
p->data =e;
printf("替换成功!\n");
}
}
void List_Replace_Elem(LinkList &L,int e,int a)
{
LinkList p=L;
int i=0;
while(inext; 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&&jnext;++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&&inext;
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(inext ;
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(inext;
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;
}