⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 链表基本操作.cpp

📁 作业题
💻 CPP
字号:
#include  "iostream.h"
#include  "stdio.h"
#include  "malloc.h"

typedef struct lnode
{
  char data;
  struct lnode  * next;
} lnode;

lnode *creat()//尾插法建表
{
 lnode *head,*rear,*p;
 char ch;
 head=new lnode;
 rear=head;
 printf("\n请输入链表元素,并以#键结束\n");
 while(cin>>ch,ch!='#')
 {   	 
  p=new lnode;
  p->data=ch;
  rear->next=p;
  rear=p;
 }
 rear->next=NULL;
 return head;
}
void  print(lnode *head)//打印链表
{  lnode  *p;
   printf("\n");
   p = head->next;
   while(p)
   { printf("%c",p->data);
     p=p->next;
   }
}

lnode  *visitll(lnode *h , char x)//按值查找       
{
  lnode  *p;
  p = h;
  while((p->data!=x)&&(p!=NULL))
    p = p->next;
  return(p);//返回结点指针
}




void GET(lnode *head,char i) /*按序号查找*/ 
{ 
int j; 
lnode *p; 
j='0';p=head; 
while((j <i)&&(p->next!=NULL)) 
{p=p->next;j++;} 
if(i==j)
      printf("该元素为%c",p->data);
        else
            printf("%c不在链表中",p->data);

} 


lnode  *invert(lnode *head)//反转
{
	lnode *p,*q,*r;
	p=head->next;
	q=p->next;
	while(q!=NULL)
	{r=q->next;
	q->next=p;
	p=q;
	q=r;}
	head->next->next=NULL;
	head->next=p;
	return(head);
}

int Length(lnode *head)//链表长度
{
int length;
lnode *p1;
if(head == NULL)
{
return 0;	
}
else
{
p1 = head;
length = 0;
while(p1->next != NULL) /*p1有下一个节点且不是头节点*/
{
p1 = p1->next;
length = length+1;
}
return length;
}
}

lnode *predall(lnode *h , lnode *q)//查找指针q指向结点的前驱结点,返回前驱结点的指针
{
  lnode  *p;
  if(h->next==q)
      p=NULL;
  else
   {  p = h;
      while((p->next!=q)&&(p!=NULL))
        p=p->next;
   }
  return(p);
}
void  insertll(lnode  *h , lnode  *q , char  x )//在q 指针指向结点的前面插入一个值为X的结点。
{
   lnode  *p , *r ;
   r = (lnode *)malloc(sizeof(lnode));
   r->data = x;
   if(h->next==q)
   {
  r->next=h->next;
     h->next=r;
   }
   else
      { p = predall(h , q);    //p指向q的前驱结点
        r->next=p->next;
  p->next=r;
      }
}
void deletell(lnode  *h , lnode  *q)//删除指针q指向的结点
{
  lnode  *p;
  if (h->next==q)
   h->next=NULL;
  else
   {
      p=predall(h,q);//p指向q的前驱结点
      p->next= q->next;
   }
   free(q);
}
main( )
{ lnode  *a;
  lnode  *result=NULL;
  int   choice ;
  char  data,data_cz;
  a = creat( );
  while(1)
  { printf("\n以下是单链表的应用,请选择:");
    printf("\n1、输出结点");
    printf("\n2、按值查找");
    printf("\n3、查找前驱");
    printf("\n4、查找后继");
    printf("\n5、插入结点");
    printf("\n6、删除结点");
    printf("\n7、序号查找");
	printf("\n8、反转链表");
    printf("\n9、链表长度");
	printf("\n10、退出\n");
    scanf("%d",&choice);
	
switch(choice)
{
     case  1:
        print(a);
        break;
     case  2:
         getchar( );
         printf("请输入待查结点的值:");
        data = getchar( );
		
        result = visitll(a,data);
        if  (result!=NULL)
            printf("%c在链表中",data);
        else
            printf("%c不在链表中",data);
        result = NULL;
		 print(a);
        break;
case   3:
         getchar();
         printf("请输入待查结点的值:");
        data = getchar( );
        result = visitll(a,data);
         if (result == NULL)
         {
           printf("%c不在链表中",data);
           break;
         }
        result = predall(a,result);
        if  (result!=NULL)
           printf("%c的前驱是%c",data,result->data);
        else
           printf("%c没有前驱",data);
        result = NULL;
        break;
case   4:
         getchar();
         printf("请输入待查结点的值:");
         data = getchar( );
         result = visitll(a,data);
         if (result == NULL)
          {
           printf("%c不在链表中",data);
           break;
          }
         if  (result->next!=NULL)
            printf("%c的后继是%c",data,result->next->data);
         else
            printf("%c没有后继",data);
		 print(a);
         result = NULL;
         break;
case  5:
         getchar();
         printf("请输入待插结点的值:");
         data = getchar( );
         getchar();
         printf("请输入插入在哪个结点前面:");
         data_cz=getchar( );
         result = visitll(a,data_cz);
          if (result == NULL)
          {
             printf("%c不在链表中",data);
             break;
           }
          insertll(a , result , data);
		   print(a);
        break;
case  6:
        getchar( );
        printf("请输入待删除结点的值:");
        data = getchar( );
        result = visitll(a,data);
         if (result == NULL)
         {
            printf("%c已删除",data);
            break;
         }
        deletell(a , result);
		 print(a);
        break;
case  7:
	    getchar( );
        printf("请输入待查结点的序号:");
        data = getchar( );
        GET(a,data);
        result = NULL;
		 print(a);
        break;
case 8:
	   getchar( );
       a=invert(a);
	   print(a);
	   break;
case 9:
	   getchar( );
	   Length(a);
       printf("链表长度为:%d ",Length(a));
	   break;

case 10:
        break;
defalut:
        break;
}
    if  (choice == 10 )
break;
     }
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -