关于单链表——数组

1.单链表统计负数个数

要求实现一个函数,返回带头结点的单链表中负整数的个数。

函数接口定义:

int NegativeInt(LinkList L);

L是带头结点的单链表的头指针,函数NegativeInt返回L中负整数的个数。如果单链表为空,返回0。

其中LinkList结构定义如下:

typedef int ElemType;

typedef struct LNode

{

    ElemType data;

    struct LNode *next;

}LNode,*LinkList;

输入格式输入数据为1行,给出以-1结束的单链表元素(-1不属于单链表元素),所有数据之间用空格分隔。

输出格式输出一个整数,表示负数个数

代码如下:

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

typedef int DataType; 
struct Node
{
    DataType      data; 
    struct Node*  next;  
};
typedef struct Node* PNode;    
typedef struct Node* LinkList;   


LinkList SetNullList_Link() 
{
    LinkList head = (LinkList)malloc(sizeof(struct Node));
    if (head != NULL) head->next = NULL;
    else printf("alloc failure");
    return head; 
}

void CreateList_Tail(PNode head)
{
    PNode p = NULL;
    PNode q = head;
    DataType data;
    scanf("%d", &data);
    while (data != -1)
    {   
        p = (struct Node*)malloc(sizeof(struct Node));
        p->data = data;
        p->next = NULL;
        q->next = p;
        q = p;
        scanf("%d", &data);
    }
}

void print(LinkList head)   
{
    PNode  p = head->next;
    int i;
    while (p)
    {
    	if(p->data<0)//返回data的值 
    	{
    		i++;
		}
       p = p->next;//将next的值赋给p 
    }
	 printf("NegativeInt=%d ",i++);
}
void DestoryList_Link(LinkList head)  
{
    PNode  pre = head; 
    PNode p = pre->next;
    while (p)
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
}

int main()
{
    LinkList head = NULL;
    head = SetNullList_Link();
    CreateList_Tail(head);
    
	/*To Do List*/
    
    print(head);
    DestoryList_Link(head);
    return 0;
}

2.移动链表中的最大值到尾部

编写函数MoveMaxToTail(),实现查找单链表中值最大的结点,并将其移动到链表尾部,注意其他结点的相对次序不变。要求尽量具有较高的时间效率。

函数接口定义:

void MoveMaxToTail (LinkList H );

typedef int DataType;

struct Node

{

    DataType      data;

    struct Node*  next;  

};

typedef struct Node  *PNode;    

typedef struct Node  *LinkList;   

输入格式8 12 46 30 5

输出格式8 12 30 5 46

代码如下:

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

typedef int DataType; 
struct Node
{
    DataType      data; 
    struct Node*  next;  
};
typedef struct Node* PNode;    
typedef struct Node* LinkList;   


LinkList SetNullList_Link() 
{
    LinkList head = (LinkList)malloc(sizeof(struct Node));
    if (head != NULL) head->next = NULL;
    else printf("alloc failure");
    return head; 
}

void CreateList_Tail(PNode head)
{
    PNode p = NULL;
    PNode q = head;
    DataType data;
    scanf("%d", &data);
    while (data != -1)
    {   
        p = (struct Node*)malloc(sizeof(struct Node));
        p->data = data;
        p->next = NULL;
        q->next = p;
        q = p;
        scanf("%d", &data);
    }
}

void MoveMaxToTail(LinkList head)
{
    LinkList s = head; // 当前节点的前一个节点指针
    LinkList p = head->next; // 当前节点指针/定义两个指针p,s 
    LinkList max = p; // 最大值节点指针
    LinkList maxPrev = head; // 最大值节点的前一个节点指针// 用于保存 ,找到最大值节点和其前一个节点
    
    while (p != NULL)
    {
        if (max->data < p->data)
        {
            max = p;//最大节点 
            maxPrev = s;//最大节点前驱 
        }
        s = p;//更新前驱节点 
        p = p->next;
    }
    
    // 如果最大值节点已经在链表尾部,则无需移动
    if (max->next == NULL)
    {
        return;
    }
    
    // 将最大值节点从链表中删除
    maxPrev->next = max->next;
    
    // 将最大值节点移动到链表尾部
    p = head;
    while (p->next != NULL)
    {
        p = p->next;
    }
    p->next = max;//max节点添加 
    max->next = NULL;
}


void print(LinkList head)   
{
    PNode  p = head->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
}
void DestoryList_Link(LinkList head)  
{
    PNode  pre = head; 
    PNode p = pre->next;
    while (p)
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
}

int main()
{
    LinkList head = NULL;
    head = SetNullList_Link();
    CreateList_Tail(head);
    MoveMaxToTail( head);//实现查找单链表中值最大的结点,并将其移动到链表尾部,注意其他结点的相对次序不变
	/*To Do List*/
    
    print(head);
    DestoryList_Link(head);
    return 0;
}

3.删除单链表的重复结点

实现一个函数,pur_LinkList(LinkList L)函数是删除带头结点单链表的重复结点。

函数接口定义:

void  pur_LinkList(LinkList L);

其中L是用户传入的参数。L是带头结点单链表的头指针。

typedef int datatype;

typedef struct node

{

    datatype data;

    struct node *next;

}LNode, *LinkList;

输入格式1 2 3 3 3 4 5 6 7 8 -1

输出格式1     2     3     4     5     6     7     8

代码如下:

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

typedef int DataType; 
struct Node
{
    DataType      data; 
    struct Node*  next;  
};
typedef struct Node* PNode;    
typedef struct Node* LinkList;   


LinkList SetNullList_Link() 
{
    LinkList head = (LinkList)malloc(sizeof(struct Node));
    if (head != NULL) head->next = NULL;
    else printf("alloc failure");
    return head; 
}

void CreateList_Tail(PNode head)
{
    PNode p = NULL;
    PNode q = head;
    DataType data;
    scanf("%d", &data);
    while (data != -1)
    {   
        p = (struct Node*)malloc(sizeof(struct Node));
        p->data = data;
        p->next = NULL;
        q->next = p;
        q = p;
        scanf("%d", &data);
    }
}

void pur_LinkList(LinkList L)
{
    LinkList p = L->next; // p为当前节点
    LinkList q = L; // q为p的前驱节点
    LinkList x;  
    while (p != NULL)
    {
       q = p;
       x = q->next;
       while (x != NULL)
       {
            if(x->data == p->data)
            {
                q->next = x->next;
            }
            else
            {
                q = q->next;
            }
            x = x->next;
       }
       p =p->next;
    }
}

void print(LinkList head)   
{
    PNode  p = head->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
}
void DestoryList_Link(LinkList head)  
{
    PNode  pre = head; 
    PNode p = pre->next;
    while (p)
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
}

int main()
{
    LinkList head = NULL;
    head = SetNullList_Link();
    CreateList_Tail(head);
    pur_LinkList(head);
	/*To Do List*/
    
    print(head);
    DestoryList_Link(head);
    return 0;
}

4.链表合并

有两个单链表A、B,其中元素递增有序,本题要求实现一个函数merge(LinkList A, LinkList B),将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。

函数接口定义:

LinkList merge(LinkList A, LinkList B);

其中 A 和 B 都是用户传入的参数。 A 是单链表A的头指针; B 是单链表B的头指针。函数须返回单链表C的头指针。

typedef int datatype;

typedef struct node

{

    datatype data;

    struct node *next;

}LNode, *LinkList;

输入格式1 3 5 7 9 -1

              2 4 6 8 8 10 -1

输出格式10   9     8     8     7     6     5     4     3    2   1

代码如下:

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

typedef int DataType; 
struct Node
{
    DataType      data; 
    struct Node*  next;  
};
typedef struct Node* PNode;    
typedef struct Node* LinkList;   


LinkList SetNullList_Link() 
{
    LinkList head = (LinkList)malloc(sizeof(struct Node));
    if (head != NULL) head->next = NULL;
    else printf("alloc failure");
    return head; 
}

void CreateList_Tail(PNode head)
{
    PNode p = NULL;
    PNode q = head;
    DataType data;
    scanf("%d", &data);
    while (data != -1)
    {   
        p = (struct Node*)malloc(sizeof(struct Node));
        p->data = data;
        p->next = NULL;
        q->next = p;
        q = p;
        scanf("%d", &data);
    }
}

void merge(LinkList A, LinkList B)
{
    LinkList C;
    PNode p,q,s;
    p = A->next;
    q = B->next;
    C = A;//C表的头结点
    C->next = NULL;
    while ( p && q )
    {
        if ( p->data < q->data )
        {
            s = p;
            p = p->next;
        }
        else 
        {
            s = q;
            q = q->next;
        }//从原AB表中取出较小者
        s->next = C->next;//插入到 C表的头部
        C->next = s;
    }
    if ( p==NULL ) p=q;
    while(p)//将剩余的结点一个个取出 ,插入到 C表的头部
    {
        s = p;
        p = p->next;
        s->next = C->next;
        C->next = s;    
    }
}

void print(LinkList head)   
{
    PNode  p = head->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
}

void DestoryList_Link(LinkList head)  
{
    PNode  pre = head; 
    PNode p = pre->next;
    while (p)
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
}


   int main()
{
    LinkList A = NULL;
    LinkList B = NULL;
    LinkList C = NULL;
    
    A = SetNullList_Link();
    CreateList_Tail(A);
    B = SetNullList_Link();
    CreateList_Tail(B);
   // MoveMaxToTail(LinkList L);
   
    /*To Do List*/
    merge(A,B);
    //MoveMaxToTail(C);
    print(A);
    DestoryList_Link(C);
    return 0;
}

  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值