数据结构-单链表、双链表、循环链表的基本操作

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;
 }

猜你喜欢

转载自blog.csdn.net/qq_40251838/article/details/80548666