两个双向链表,删除data成员值相同的节点。

该博客展示了链表相关操作的代码。定义了链表节点结构体,实现了创建链表、输出链表的功能。还提供了删除指定值节点和删除两个链表中相同值节点的函数,并给出了测试代码,通过这些操作完成链表节点的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdlib.h>
#include "size.h"
/* define node type */
typedef struct node{
    int data;
    struct node *front,*next;
}node,*linkHead;

/* creat a list ,the argument n is the length of the list*/
void creatList(linkHead *head,int n)
{
    int c=0;
    linkHead p;
    linkHead h=(linkHead)malloc(sizeof(node));
    h->front=NULL;
    h->data=n;
    while(c <= n){
        c++;
        if(c == 1) *head=h;
        else{
        p=(linkHead)malloc(sizeof(node));
        scanf("%d",&p->data);
        h->next=p;
        p->front=h;
        h=p;
        }
    p->next=NULL;
    }
}
/* output the list */
void printList(const linkHead head)
{
    linkHead p=head->next;
    while(p){
        printf("/t%d/n",p->data);
        p=p->next;
    }
}

/* delete the node whose value of data equals with argument
 * value, if deleting success function returns 1 and the length of the
 * list is deducted by 1,else function will return 0.
*/
int delNode(linkHead *list,int value)
{
    linkHead p=(*list)->next;
    while(p){
        if(p->data == value){
            if(p->next){
                p->front->next=p->next;
                p->next->front=p->front;
                free(p);
                (*list)->data--;
                return 1;
            }
            else {
                p->front->next=NULL;
                free(p);
                (*list)->data--;
                return 1;
            }
        }else p=p->next;
    }
    return 0;
}

/* delete all the nodes whose value of data equal in two list separately */
void delSame(linkHead *list1,linkHead *list2)
{
    int array[MAX_SIZE]={0};
    linkHead q=(*list2)->next;
    if(!q) return;
    else{
    int i=0;
    int j=0;
    int k=0;
    int temp=0;
    while(q){
        if(delNode(list1,q->data)){
            array[i++]=q->data;
            temp=(*list1)->data;
            for(j=0; j<temp; j++)
                delNode(list1,q->data);
            q=q->next;
        }
        else q=q->next;
    }
    for(j=0;j<i;j++)
        printf("/t/t%d/n",array[j]);
    temp=(*list2)->data;
    for(j=0;j<i;j++) {
        for(k=0; k<temp; k++)
        delNode(list2,array[j]);
    }
    }
}

/* the test */
main()
{
linkHead list1,list2;
creatList(&list1,6);        
creatList(&list2,8);
delSame(&list1,&list2);
printList(list1);
printf("/n");
printList(list2);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值