首页 > 生活 > > 正文
2023-12-05 09:36:05

c++实现链表的基本操作(链表的基本操作)

导读 大家好,我是小夏,我来为大家解答以上问题。c++实现链表的基本操作,链表的基本操作很多人还不知道,现在让我们一起来看看吧!给你一段参...

大家好,我是小夏,我来为大家解答以上问题。c++实现链表的基本操作,链表的基本操作很多人还不知道,现在让我们一起来看看吧!

给你一段参考代码:

#include<stdio.h>

#include<stdlib.h>

typedef struct Node

{

int data;

struct Node *next;

}Node;

void Print(Node *HA,Node *HB,Node *HC);

void Choose(int choice,Node *HA,Node *HB,Node *HC);

void CreateChain(Node *H);

void PrintChain(Node *H);

void Combine(Node *HA,Node *HB,Node *HC);

int main(void)

{

Node *HA;

Node *HB;

Node *HC;

HA=(Node *)malloc(sizeof(Node));

HB=(Node *)malloc(sizeof(Node));

HC=(Node *)malloc(sizeof(Node));

HA->next=NULL;

HB->next=NULL;

HC->next=NULL;

Print(HA,HB,HC);

while(true)

{

   printf("按enter键继续操作...");

   getchar();

   getchar();

   system("cls");

    Print(HA,HB,HC);

}

return 0;

}

void Print(Node *HA,Node *HB,Node *HC)

{

int choice;

printf("Made By 杨梅树的盔甲~O(∩_∩)O~ ");

printf("--------------------- ");

printf("1.建立新的递增单链表A. ");

printf("2.输出当前线性表A. ");

printf("3.建立新的递增单链表B. ");

printf("4.输出当前线性表B. ");

printf("5.将表A和表B归并为表C. ");

printf("6.输出当前线性表C. ");

printf("--------------------- ");

printf("请选择你要的操作:");

scanf("%d",&choice);

Choose(choice,HA,HB,HC);

}

void Choose(int choice,Node *HA,Node *HB,Node *HC)

{

switch(choice)

{

case 1:

   CreateChain(HA);

   break;

case 2:

   PrintChain(HA);

   break;

case 3:

   CreateChain(HB);

   break;

case 4:

   PrintChain(HB);

   break;

case 5:

   Combine(HA,HB,HC);

   break;

case 6: 

   PrintChain(HC);

   break;

default:

   exit(0);

}

}

//尾插法建递增单链表,并检查单链表是否为递增

void CreateChain(Node *H)

{

Node *s;

Node *p;//动态指向表尾

p=H;

int n;

int i;

//输入N,并判断N是否合法

while(true)

{

   printf("请输入单链表长度:");

   scanf("%d",&n);

   if(n>0)

   {

    break;

   }

   else

   {

    printf("Error:单链表的长度必须大于零! ");

   }

}

//for(i=0;i<n;i++)

//{

// s=(Node *)malloc(sizeof(Node));

// scanf("%d",&s->data);

// s->next=p->next;

// p->next=s;

// p=p->next;

//}

//输入单链表并判断其合法性

while(true)

{

   int flag;

   printf("请输入单链表: ");

   H->next=NULL;//警告!此处必须再次初始化!以确保重复建表的无误!!!!!(十分重要!!!)

   p=H;//动态指向表尾

   for(i=0;i<n;i++)

    {

    s=(Node *)malloc(sizeof(Node));

      scanf("%d",&s->data);

    s->next=p->next;

    p->next=s;

    p=p->next;

    }

   //检查建表的合法性

   //当非法建表时最好先释放错误链表的内存(待改善)

   p=H->next;

   flag=1;

   while(p->next!=NULL)

   {

    if(p->data<=p->next->data)

    {

    p=p->next;

    }

    else

    {

    flag=0;

    printf("Error:建表非法!单链表必须为递增! ");

    break;

    }

   }

   if(flag)break;

}

printf("成功创建新单链表! ");

PrintChain(H);

}

void PrintChain(Node *H)

{

printf("当前单链表为: ");

Node *p;

p=H->next;

if(p==NULL)

{

   printf("空表 ");

}

else

{

    while(p!=NULL)

    { 

    printf("%d ",p->data);

    p=p->next;

    }

    printf(" ");

}

}

void Combine(Node *HA,Node *HB,Node *HC)

{

Node *pa;

Node *pb;

Node *pc;

Node *temp;

HC->next=NULL;//初始化,保证重复操作的正确性

pa=HA;

pb=HB;

pc=HC;

while(pa->next!=NULL && pb->next!=NULL)

{

   if(pa->next->data<=pb->next->data)

   {

    temp=pa->next->next;

    pa->next->next=pc->next;

    pc->next=pa->next;

    pc=pc->next;

    pa->next=temp;

   }

   else

   {

    temp=pb->next->next;

    pb->next->next=pc->next;

    pc->next=pb->next;

    pc=pc->next;

    pb->next=temp;

   }

}

while(pa->next!=NULL)

{

   temp=pa->next->next;

   pa->next->next=pc->next;

   pc->next=pa->next;

   pc=pc->next;

   pa->next=temp;

}

while(pb->next!=NULL)

{

   temp=pb->next->next;

   pb->next->next=pc->next;

   pc->next=pb->next;

   pc=pc->next;

   pb->next=temp;

}

printf("归并成功! ");

}

本文到此讲解完毕了,希望对大家有帮助。