奥普瓯江 发表于 2021-9-28 18:23:37

初始化链表、头插链表、尾插链表、两个链表相连

相连后我就不释放N链表的头节点了我这从新建立了一个K链表返回之后付给新新链表

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAXSIZE 10

typedef struct Like
{
    int T;
    struct Like *next;
}Like, *Likes;


void Explain();   //程序说明
void InitList(Likes *N);    //初始化及清除数据
void TailList(Likes *M);   //创建尾插法链表
void HeadList(Likes *N);   //创建尾插法链表
void AlPuList(Like *N);   //打印链表
struct Like *LinkList(Like *N, Like *M); //两个链表合并

struct Like *LinkList(Like *N, Like *M)
{
    Like *temp = N->next->next;   //N的一号节点传给临时变量
    N->next->next = M->next->next;//M的1号节点传给N尾节点之后
    M->next->next = temp;         //N1号节点传给M节点之后也就是当M的一号数据

    return M->next;
}

void AlPuList(Like *N)
{
    Like *temp = N->next;

    do
    {
      printf("<%d>", temp->T);
      temp = temp->next;

    }while(temp != N->next);
    putchar('\n');

}

void TailList(Likes *M)
{
    Like *temp, *tail;
    srand((unsigned)time(NULL));      //随意创建N个链表

    for(int i = 0; i < MAXSIZE; i++)
    {
      temp = (Likes )malloc(sizeof(Like ));
      temp->T = (rand() % 100);
      temp->next = (*M)->next;

      if((*M)->next == *M)
      {
            (*M)->next = temp;
      }
      else
      {
            tail->next = temp;
      }
      tail = temp;
    }
    (*M)->next = tail;

}
void HeadList(Likes *N)
{
    Like *temp, *tail;
    srand((unsigned)time(NULL));

    for(int i = 0; i < MAXSIZE; i++)
    {
      temp = (Likes )malloc(sizeof(Like ));
      temp->T = (rand() % 100);

      if((*N)->next == *N )
      {
            (*N)->next = temp;
            temp->next = temp;//自己指向自己
            tail = temp;      //把尾链表传给tail,(tail不做更改)
      }
      else
      {
            temp->next = (*N)->next;    //把链表1号节点传给临时链表temp->next
            (*N)->next = temp;          //把temp替换1号节点的数据因为前面已经做了向下一个的next所以链表是相连的
            tail->next = temp;          //把尾节点的指向next替换成新的1号节点点形成循环
      }
    }
    (*N)->next = tail;                  //把链表的头节点指向链表的尾节点

}

void InitList(Likes *N)
{
    Like *temp,*temps;

if(*N != NULL)
    {
      temp = (*N)->next;
      do
      {
            temps = temp;
            temp = temp->next;
            free(temps);
      }while((*N)->next != temp);
    }
    else
    {
      *N = (Likes )malloc(sizeof(Like ));
    }
    (*N)->next = *N;




}
void Explain()
{
    printf("1、初始化程序及清除数据\n");
    printf("2、创建头插法链表\n");
    printf("3、创建尾插法链表\n");
    printf("4、两个链表合并\n");
    printf("9、打印全部链表\n");
    printf("0、结束本程序\n");
}

int main()
{
    int i;
    Like *N = NULL, *M = NULL, *K;

    Explain();

    while(1)
    {
      printf("输入选项:");
      scanf("%d",&i);

      switch(i)
      {
            case 1:{
                InitList(&N);
                InitList(&M);
            }
            break;
            case 2:{
                HeadList(&N);
            }
            break;
            case 3:{
                TailList(&M);
            }
            break;
            case 4:{
                K = LinkList(N, M);
                AlPuList(K);
            }
            break;
             case 9:{
               AlPuList(N);
               AlPuList(M);
            }
            break;
            case 0:{
                return 0;
            }
            break;
      }

    }

    return 0;
}
页: [1]
查看完整版本: 初始化链表、头插链表、尾插链表、两个链表相连