单链表元素查找educoder

12 篇文章 2 订阅
6 篇文章 5 订阅
/*使用尾插法建立单链表,并返回指向单链表的头结点的指针*/
Node *CreateAtTail(DataType a[],int n)
{
    int i;
	Node *first,*s,*r;
	first=InitList(); //初始化单链表
	r=first;
	for(i=0;i<n;i++)
    {
        s=(Node *)malloc(sizeof(Node));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
    return first;
}
/*按位查找,查找单链表中第i个结点,并将此结点的值返回,若没有标号为i的结点,返回-1*/
DataType Get(Node *first,int i)
{
    Node *p;
    int count=0;
    /**************Begin***************/
       p=first;
       while(p->next!=NULL&&count<i)
       {
           p=p->next;
           count++;
       }
       if(count==i)
       return p->data;
       else
       return -1;
    /**************End****************/
}
/*按值查找,查找单链表中值为x的结点的序号,并返回此序号,找不到,返回0*/
int Locate(Node *first,DataType x)
{
    Node *p = first->next;
    int count=1;
    /**************Begin***************/
    while(p!=NULL&&p->data!=x)
    {
        p=p->next;
        count++;
    }
    if(p!=NULL)
    {
 return count;
    }
    else 
    return 0;

    /**************End****************/
}

单链表循环队列是一种基于单链表实现的队列数据结构,可以实现先进先出的数据存储和读取。它的特点是队列的首尾节点相连,形成一个环形结构,队列的头指针和尾指针都指向环形结构上的某个节点,可以循环利用已经出队的节点。 下面是一个简单的单链表循环队列的实现过程: 1. 定义队列的结构体,包括头指针、尾指针和队列长度等信息。 ```c typedef struct queueNode { int data; struct queueNode *next; }QueueNode; typedef struct { QueueNode *head; QueueNode *tail; int size; }Queue; ``` 2. 初始化队列,将头指针和尾指针指向同一个节点,即创建一个空的链表。 ```c void initQueue(Queue *queue) { queue->head = (QueueNode *)malloc(sizeof(QueueNode)); queue->tail = queue->head; queue->head->next = NULL; queue->size = 0; } ``` 3. 判断队列是否为空。 ```c bool isEmpty(Queue *queue) { return queue->size == 0; } ``` 4. 判断队列是否已满,由于单链表循环队列的长度是固定的,因此只需要判断队列长度是否达到上限即可。 ```c bool isFull(Queue *queue) { return queue->size == MAX_QUEUE_SIZE; } ``` 5. 元素入队,将新元素插入到队列的尾部。 ```c void enQueue(Queue *queue, int data) { if (isFull(queue)) { printf("Queue is full!\n"); return; } QueueNode *newNode = (QueueNode *)malloc(sizeof(QueueNode)); newNode->data = data; newNode->next = NULL; queue->tail->next = newNode; queue->tail = newNode; queue->size++; } ``` 6. 元素出队,将队列的头部元素删除并返回。 ```c int deQueue(Queue *queue) { if (isEmpty(queue)) { printf("Queue is empty!\n"); return -1; } QueueNode *temp = queue->head->next; int data = temp->data; queue->head->next = temp->next; if (queue->tail == temp) { queue->tail = queue->head; } free(temp); queue->size--; return data; } ``` 7. 获取队列的长度。 ```c int size(Queue *queue) { return queue->size; } ``` 8. 清空队列,将队列中的所有元素删除。 ```c void clear(Queue *queue) { while (!isEmpty(queue)) { deQueue(queue); } } ``` 以上就是单链表循环队列的基本实现过程。需要注意的是,在每次出队操作时,需要判断队列中是否只有一个元素,若是,则需要将尾指针指向头指针。同时,由于单链表循环队列的长度是固定的,因此在插入新元素时需要判断队列是否已满。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值