数据结构 C语言版 两个链表 List1黑人List2 删除List2中与List1相同的结点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 C语言版 两个链表 List1黑人List2 删除List2中与List1相同的结点相关的知识,希望对你有一定的参考价值。

要用双重循环来做 我有那么一点点的思路 可是还是没理清 可以帮忙写下具体算法么

先用两个结构体指针指向两个表的头指针head1、head2 , 然后指针后移逐个查找 然后删除表2的相同结点,假若表是由这样的结构体构成:
struct student
char "名字";
int age; /*(年龄)*/
int num; /*(学号)*/ /*我们用学号来判断相同结点*/
struct student *next;
;
struct student *del(struct student *head1,struct student *head2) 函数
struct student *p1,*p2,*p;
p1=head1; *在这里建立链表的过程就不写了*
p2=head2;
while(p1->next!=NULL&&p2->next!=NULL)

for(;p1!=NULL;p1++)
for(;p2!=NULL;p2++)
if(p1->unm==p2->num) /* 找到相同的结点*/
if(p2==head2)
head2=p2->next; /* 如果首结点相同,删除p2的首结点 */
else
p=--p2;
p->next=p2->next; /*删除结点*/



return(head2);
以上并未考虑空表的情况 有什么问题及时提出来追问

for 循环里面的P1++这个在可以这样写么?这个++是什么意思啊?

追答

完全可以这样写 p1是指向一个结构体类型的指针 ,++ 就是让p1指向 下一个结构体

参考技术A 那数据结构的顺序表你写完了没有?追问

建表的算法会了 只要给我上面的算法就好了 最好有解释的 谢谢

追答

是单链表还是顺序表?
假如是顺序表的话
int x,y;
for(i=0;i<List1.size;i++)

for(j=0;j<List2.size;j++)

ListGet(List1,i,&x);
ListGet(List2,j,&y);
if(x==y)

ListDelete(&List1,i,&x);
ListDelete(&List2,j,&y);
i--;



单链表的跟这个差不多
不知道你顺序表的头文件是怎样的,跟我的是不是一样。
欢迎追问~

追问

哦 是单链表 带头结点的单链表

追答

单链表的话。
for循环也是这么写吧。
不知道你的链表怎么写的。
你先试一试看
不对的话我再看看
要不你把链表发给我看一下咯~

追问

LinkList *CreatList()
int x;
LinkList *head;
LinkList *s;
LinkList *rear;
head = (LinkList *)malloc(sizeof(LinkList));
rear = head;
scanf("%d",&x);
while(x!=-1)
s=(LinkList *)malloc(sizeof(LinkList));
s->data = x;
rear->next = s;
rear = s;
scanf("%d",&x);

rear->next = null;
return head;

追答

不如我发一个头文件给你吧。你这个太长了,看起来好麻烦的

追问

啊 什么头文件?

追答

就是链表的头文件。包括链表的建立,插入元素,删除元素,还有取链表中某一个元素。

追问

哦 这些我都知道的 我有的~~~

追答

那你把那个循环加上去还是不能实现你需要的结果吗?

追问

你那个是顺序表的 我现在还刚开始学单链表 怎么变换不会 ~~

追答

那你把你这个链表所有的实现都发给我吧。你刚才发上来的是链表初始化吧。
把那些插入元素,删除元素,取元素什么的都发给我看一下 发邮箱来吧
不知道你那个是怎么写的我就不知道怎么改了
发到我邮箱里面把279656047@qq.com

追问

有个人已经帮我写出来了 呵呵 麻烦你了~~~

追答

没事。是我说不好意思才对啊。搞这么久没帮上什么忙~

纯C语言(C89)实现简单链表

起因

工作很少接触纯C项目,业余写着玩玩,不断雕琢

目标

纯C实现简单链表,提供方便易用泛型接口,避免依赖

实现

完全封装,隐藏结构体细节,不支持栈创建
拷贝存储,轻微性能代价换来易用性

list.h

#ifndef LIST_H
#define LIST_H
#include <stddef.h>

typedef struct ListItem_ ListItem;
typedef struct List_ List;
List* list_new();
void list_free(List* l);

size_t list_length(List* l);
ListItem* list_head(List* l);
ListItem* list_tail(List* l);

ListItem* list_next(ListItem* e);
size_t list_data(ListItem* e, void** data);

int list_insert_next(List* l, ListItem* e, void* data_in, size_t size);
int list_remove_next(List* l, ListItem* e);

#endif // LIST_H

list.c

#include "list.h"
#include <stdlib.h>
#include <string.h>

typedef unsigned char byte;

typedef struct ListItem_ 
    struct ListItem_* next;
    byte* data;
    size_t size;
 ListItem;

typedef struct List_ 
    size_t count;
    ListItem* head;
    ListItem* tail;
 List;

List* list_new() 
    List* l = calloc(1, sizeof(List));
    return l;


void list_free(List* l) 
    while (list_length(l) > 0) 
        list_remove_next(l, 0);
    


size_t list_length(List* l) 
    return l->count;


ListItem* list_head(List* l) 
    return l->head;


ListItem* list_tail(List* l) 
    return l->tail;


ListItem* list_next(ListItem* e) 
    return e->next;


size_t list_data(ListItem* e, void** data) 
    if (!e) return 0;
    *data = e->data;
    return e->size;


int list_insert_next(List* l, ListItem* e, void* data_in, size_t size) 
    ListItem* e_new = calloc(1, sizeof(ListItem));
    if (!e_new) return -1;
    e_new->data = calloc(size, sizeof(byte));
    if (e_new->data) 
        memcpy(e_new->data, data_in, size);
        e_new->size = size;
     else 
        free(e_new);
        return -1;
    
    if (l->count == 0) 
        if (e) return -1;
        l->head = e_new;
        l->tail = e_new;
     else if (e) 
        e_new->next = e->next;
        e->next = e_new;
        if (!e_new->next) 
            l->tail = e_new;
     else 
        e_new->next = l->head;
        l->head = e_new;    
    
    l->count ++;
    return 0;


int list_remove_next(List* l, ListItem* e) 
    ListItem* e_next;
    if (l->count == 0) return -1;
    if (e) 
        if (!e->next) return -1;
        e_next = e->next;
        e->next = e_next->next;
     else 
        e_next = l->head;
        l->head = e_next->next;
        if (l->count == 1) l->tail = 0;
    
    free(e_next->data);
    free(e_next);
    l->count --;
    return 0;

测试

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

int main(int argc, char *argv[]) 
    List* l = list_new();
    ListItem* it;
    size_t l_len = 0;
    int i, x, y, *p, n;
    for (i=0; i<10; i++) 
        list_insert_next(l,0,&i,sizeof(i));
    
    l_len = list_length(l);
    printf("l_len:%d \n", l_len);
    while (list_length(l) > 0) 
        if (!list_remove_next(l,0)) 
            n = list_data(list_head(l), &p);
            if (n) printf("list_head:%d size:%d \t", *p, n);
            n = list_data(list_tail(l), &p);
            if (n) printf("list_tail:%d size:%d \n", *p, n);        
        
    
    list_free(l);
    return 0;
l_len:10
list_head:8 size:4      list_tail:0 size:4
list_head:7 size:4      list_tail:0 size:4
list_head:6 size:4      list_tail:0 size:4
list_head:5 size:4      list_tail:0 size:4
list_head:4 size:4      list_tail:0 size:4
list_head:3 size:4      list_tail:0 size:4
list_head:2 size:4      list_tail:0 size:4
list_head:1 size:4      list_tail:0 size:4
list_head:0 size:4      list_tail:0 size:4

以上是关于数据结构 C语言版 两个链表 List1黑人List2 删除List2中与List1相同的结点的主要内容,如果未能解决你的问题,请参考以下文章

合并两个排序链表

数据结构——二叉链表创建二叉树(C语言版)

数据结构C语言版 —— 链表增删改查实现(单链表+循环双向链表)

数据结构笔记(C语言版)严蔚敏

纯C语言(C89)实现简单链表

c/c++单链表面试题—链表相交问题