#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node* pre;
struct Node* next;
}Node;
Node* init(){
Node* head=(Node*)malloc(sizeof(Node));
head->data=0;
head->next=NULL;
head->pre=NULL;
return head;
}
int isEmpty(Node* list){
return list->next==NULL;
}
void inqueue(Node* list,int data){
if(list->next==NULL){
Node* node=(Node*)malloc(sizeof(Node));
node->data=data;
node->next=list->next;
node->pre=list;
list->next=node;
return;
}
Node* p=list->next;
while(p->next){/////////////////////////////////////////////× :第一个结点的下一个结点存在才循环
p=p->next;
}
Node* node=(Node*)malloc(sizeof(Node));
node->data=data;
node->next=p->next;
node->pre=p;
p->next=node;
}
int outqueue(Node* list){
Node *p=list->next;
int value=p->data;
list->next=p->next;
p->next->pre=list;
free(p);
return value;
}
int gettop(Node* list){
Node* p=list->next;
int value=p->data;
return value;
}
int search(Node* list,int index){
Node* p=list->next;
for(int i=1;i<index;i++){
p=p->next;
}
int value=p->data;
return value;
}
int finddata(Node* list,int data){
Node* p=list->next;
int count=0;
while(p->next){
count++;
if(p->data==data){
return count;
}
p=p->next;
}
return -1;
}
void delete(Node* list,int index){
Node* p=list->next;
for(int i=1;i<index;i++){
p=p->next;
}
p->next->pre=p->pre;
p->pre->next=p->next;
free(p);
}
void deletedata(Node* list,int data){
Node* p=list->next;
while(p->next){
if(p->data==data){
p->next->pre=p->pre;
p->pre->next=p->next;
}
p=p->next;
}
}
void print(Node* list){
Node* p=list->next;
while(p!=NULL){
printf("%d",p->data);
p=p->next;
}
}
int main()
{
Node* a=init();
inqueue(a,1);
inqueue(a,2);
inqueue(a,3);
inqueue(a,4);
print(a);
printf("\n");
outqueue(a);
print(a);
printf("\n");
printf("队首元素:");
printf("%d",gettop(a));
printf("\n");
printf("查找元素2位置:");
printf("第%d个",finddata(a,2));
printf("\n");
printf("删除元素4:");
deletedata(a,4);
print(a);
printf("\n");
printf("查找第一个元素:");
printf("%d",search(a,1));
printf("\n");
printf("删除第一个元素:");
delete(a,1);
print(a);
return 0;
}
因为4是最后一个元素,所以你还要加个判断
void deletedata(Node *list, int data)
{
Node *p = list->next;
while (p->next)
{
if (p->data == data)
{
p->next->pre = p->pre;
p->pre->next = p->next;
}
p = p->next;
}
if (p->data == data) //若删除的是最后一个元素
p->pre->next = NULL;
}
【以下回答由 GPT 生成】
问题分析: 在代码中提供了一个队列数据结构的实现,但是删除元素4的操作有问题,主要涉及到outqueue函数的逻辑错误。
解决方案: 1. 在outqueue函数中,需要先判断队列是否为空,如果为空则直接返回错误提示信息。 2. 在outqueue函数中,需要先判断队列中第一个元素是否为4,如果是则直接删除并返回。 3. 在outqueue函数中,如果第一个元素不是4,则需要通过遍历查找到元素4所在的位置,然后删除该节点。
下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node* pre;
struct Node* next;
} Node;
Node* init(){
Node* head = (Node*)malloc(sizeof(Node));
head->data = 0;
head->next = NULL;
head->pre = NULL;
return head;
}
int isEmpty(Node* list){
return list->next == NULL;
}
void inqueue(Node* list, int data){
if(list->next == NULL){
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = list->next;
node->pre = list;
list->next = node;
return;
}
Node* p = list->next;
while(p->next){
p = p->next;
}
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = p->next;
node->pre = p;
p->next = node;
}
int outqueue(Node* list){
if(isEmpty(list)){
printf("The queue is empty!\n");
return -1;
}
Node* p = list->next;
if(p->data == 4){
int value = p->data;
list->next = p->next;
if(p->next){
p->next->pre = list;
}
free(p);
return value;
}
while(p && p->data != 4){
p = p->next;
}
if(p){
int value = p->data;
p->next->pre = p->pre;
p->pre->next = p->next;
free(p);
return value;
}else{
printf("Element 4 not found!\n");
return -1;
}
}
int gettop(Node* list){
Node* p = list->next;
int value = p->data;
return value;
}
int search(Node* list, int index){
Node* p = list->next;
for(int i=1; i<index; i++){
p = p->next;
}
int value = p->data;
return value;
}
这样修改后的代码可以正确删除元素4。
使用方法: 1. 初始化队列: Node* list = init(); 2. 入队操作: inqueue(list, value); 3. 出队操作: int result = outqueue(list); 4. 获取队首元素: int top = gettop(list); 5. 查询指定位置的元素: int value = search(list, index);
【相关推荐】