精华内容
下载资源
问答
  • /*有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中相同学号的那些结点*/ #include <stdio.h> #include <stdlib.h> typedef struct student{ long num; char name[10]; struct ...
    /*有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点*/
    
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct student{
    	long num;
    	char name[10];
    	struct student *next;
    }student,*Student;
    
    //创建链表 
    Student creat()
    {
        Student s;
    	int n = 0;
    	Student p1,p2;
    	s = p1 = p2 = (Student) malloc(sizeof(student));
    	
    	printf("请输入学生学号和姓名:\n");
    	scanf("%ld %s",&p1->num,&p1->name);
    	
    	while(p1->num != 0)
    	{
    		n = n + 1;
    		if(n == 1) s = p1;
    		else p2->next = p1;
    		p2 = p1;
    		p1 = (Student) malloc(sizeof(student));
    		scanf("%ld %s",&p1->num,&p1->name); 
    	}
    	p2->next = NULL;
    	
    	return s;
    } 
    
    //输出链表 
    void print(Student s)
    {
    	Student p;
    	printf("\nNow,The records are:\n");
    	p = s->next;
    	if(s != NULL)
    	{
    		do
    		{
    			printf("%ld %s\n",p->num,p->name);
    			p = p->next;
    		}while(p != NULL);
    	}
    } 
    
    void delect(Student a,Student b)
    {
    	Student p1,p2,q1,q2;
    	int flag = 0;
        p1 = a;
        q1 = b->next;
        
        while(q1)
        {
        	p1 = a;
        	while(p1->next != NULL)
        	{	
        	    flag = 0;
        	    p2 = p1->next;
        		if(p2->num == q1->num)
        		{
        			p1->next = p2->next;
        			flag = 1;
    			}
    			if(flag == 0)
    			p1 = p1->next;
    		}
    		q1 = q1->next;
    	}
     } 
     
    int main()
    {
    	Student a;
    	Student b;
    	a = (Student)malloc(sizeof(student));
    	b = (Student)malloc(sizeof(student));
    	
    	a->next = creat();
    	b->next = creat();
    	print(a);
    	print(b);
    	
    	delect(a,b);
    	print(a); 
    }
    

    谭浩强C程序设计(第四版)p330第11题
    为了方便删除,建立带头结点的链表,每次循环都是从a链表的头部寻找与b链表学号相同的结点,然后删除,直到b链表结束。

    展开全文
  • 1,先创建两个链表 2,删去a链表中与b链表中相同学号的节点 3,打印处理后的a链表 处理方法: 1 :创建链表: 链表 = 头指针 + 节点 所以先创建节点 typedef struct node { int sid; char name[20]; struct ...

    在这里插入图片描述
    主要思路:
    1,先创建两个链表
    2,删去a链表中与b链表中有相同学号的节点
    3,打印处理后的a链表

    处理方法:
    1 :创建链表:
    链表 = 头指针 + 节点
    所以先创建节点

    typedef struct node
    {
    	int sid;
    	char name[20];
    	struct node* next;
    }node;
    

    然后把节点串起来,并且把第一个节点的地址给头指针就成链表了
    代码:

     node* creatlink(int n) //n是链表长度,也就是节点个数,函数返回头指针
     {
     	node* p = (node*)malloc(sizeof(node)); //头指针
     	node* p2 = NULL;
     	
     	while(n--)
     	{
     		node *stu = (node*)malloc(sizeof(node));
    		printf("请输入学生信息( 学号 姓名):\n");
    		scanf("%d %s", &stu->sid, stu->name); 
    		if (p2 == NULL)
    		{
    			p->next = stu;
    			p2 = stu;
    		}
    		else
    		{
    			p2->next = stu;
    			p2 = stu;
    		 } 
    	 }
    	 p2->next = NULL;
    		
    	 return p;
     }
     
    

    2,删除相同节点:
    想像成两个数组删除相同元素,不过要注意释放空间
    稍微有点意思的是在于找到要删除节点上一个节点,如果再用循环来找显然时间复杂度太大,效率不高,所以可以事先就开始处理它;
    代码:

     void dele(node* a, node* b)
     {
     	node* tempb = NULL; //代表b的节点
     	node* tempa = NULL;//代表a 的节点
     	node* m = NULL;  //代表a节点的上一个节点
     	for (tempb = b->next; tempb != NULL; tempb = tempb->next)
     		for (m = a, tempa = a->next; tempa != NULL; )
     		{
     			if (tempa->sid == tempb->sid)
     			{
     				m->next = tempa->next; //让要删除节点tempa的上一个节点指向tempa的下一个节点
     				node* w = tempa;
     				tempa = tempa->next; //让tempa 对于它的下一个节点
     				free(w);//释放掉要删除的节点
    			 }
    			 else
    			 {
    			 	m = m->next;
    			 	tempa = tempa->next;
    			 }
    		 }
     }
    

    3,打印链表

     void printlink(node* a)
     {
    	node* p = NULL;
    	for (p = a->next; p != NULL; p = p->next)
    		printf("%d %s\n",p->sid, p->name);
     }
    

    完整代码:

    # include "stdio.h"
    # include "stdlib.h"
    
    typedef struct node
    {
    	int sid;
    	char name[20];
    	struct node* next;
    }node;
    
    node* creatlink(int n);
    void dele(node* a, node* b);
    void printlink(node* a);
     
    int main()
    {
    	node* a = creatlink(5);
    	node* b = creatlink(3);
    	dele(a, b);
    	printf("处理后:\n");
    	printlink(a);
    	
    	return 0;
     } 
     
     node* creatlink(int n)
     {
     	node* p = (node*)malloc(sizeof(node));
     	node* p2 = NULL;
     	
     	while(n--)
     	{
     		node *stu = (node*)malloc(sizeof(node));
    		printf("请输入学生信息( 学号 姓名):\n");
    		scanf("%d %s", &stu->sid, stu->name); 
    		if (p2 == NULL)
    		{
    			p->next = stu;
    			p2 = stu;
    		}
    		else
    		{
    			p2->next = stu;
    			p2 = stu;
    		 } 
    	 }
    	 p2->next = NULL;
    		
    	 return p;
     }
     
     void dele(node* a, node* b)
     {
     	node* tempb = NULL;
     	node* tempa = NULL;
     	node* m = NULL;
     	for (tempb = b->next; tempb != NULL; tempb = tempb->next)
     		for (m = a, tempa = a->next; tempa != NULL; )
     		{
     			if (tempa->sid == tempb->sid)
     			{
     				m->next = tempa->next;
     				node* w = tempa;
     				tempa = tempa->next;
     				free(w);
    			 }
    			 else
    			 {
    			 	m = m->next;
    			 	tempa = tempa->next;
    			 }
    		 }
     }
     
     void printlink(node* a)
     {
    	node* p = NULL;
    	for (p = a->next; p != NULL; p = p->next)
    		printf("%d %s\n",p->sid, p->name);
     }
    
    展开全文
  • 有两个链表a和b,设结点中包含学号,姓名.从a链表中删去与b链表中相同学号的那些节点.

    有两个链表a和b,设结点中包含学号,姓名.从a链表中删去与b链表中有相同学号的那些节点.

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #define N sizeof(stu)
    struct student {
    	int id;
    	char name[1024];
    	struct student* next;
    };
    typedef struct student stu;
    stu* creat(int n) {//创建
    	stu* head;
    	stu* s = (stu*)malloc(N);
    	head = s;
    	stu* p = head;
    	for (int i = 0; i < n; ++i) {
    		s = (stu*)malloc(N);
    		printf("请输入第%d个学生的信息\n", i + 1);
    		printf("请输入学号\n");
    		scanf("%d", &s->id);
    		printf("请输入姓名\n");
    		scanf("%s", &s->name);
    		s->next = p->next;
    		p->next = s;
    		p = p->next;
    		if (i == n - 1) {
    			p->next = NULL;
    		}
    	}
    	return head;
    }
    void print(stu* head) {//输出
    	int n = 0;
    	for (stu* p = head->next; p != NULL; p = p->next, n = 1) {
    		printf("%d\t%s\n", p->id, p->name);
    	}
    	if (n == 0) {
    		printf("链表为空\n");
    	}
    }
    void fun(stu* a, stu* b) {
    	stu* temp;
    	for (stu* p = a; p->next != NULL;) {
    		for (stu* q = b; q->next != NULL; q = q->next) {
    			if (p->next->id == q->next->id) {
    				temp = p->next;
    				p->next = temp->next;
    				free(temp);
    				break;
    			}
    			if (q->next->next == NULL) {
    				p = p->next;
    			}
    		}
    	}
    }
    void main() {
    	int n, m;
    	printf("请输入链表a的长度\n");
    	scanf("%d", &n);
    	printf("请输入链表b的长度\n");
    	scanf("%d", &m);
    	printf("请输入链表a中的学生信息\n");
    	stu* a = creat(n);
    	printf("请输入链表b中的学生信息\n");
    	stu* b = creat(m);
    	printf("链表a学生信息\n学号\t姓名\n");
    	print(a);
    	printf("链表b学生信息\n学号\t姓名\n");
    	print(b);
    	printf("删除相同学号后a链表为\n学号\t姓名\n");
    	fun(a, b);
    	print(a);
    	system("pause");
    }
    

    在这里插入图片描述在这里插入图片描述

    展开全文
  • 习题 9.11 有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中相同学号的那些结点。 代码块: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; struct ...

    C程序设计(第四版) 谭浩强 习题9.11 个人设计

    习题 9.11 有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。

    代码块:

    #include <stdio.h>
    #include <stdlib.h>
    struct Student{                                        //定义结构体Student
        int num;
        char name[20];
        Student *next;
    };
    void input(Student *stu, int n);                       //定义输入函数
    void print(Student *stu);                              //定义输出函数
    Student *del(Student *stu1, Student *stu2);     //定义删除结点函数,返回删除后a链表首地址
    int main()
    {
        Student a[3], b[2];                                //定义结构体变量a和b
        input(a, 3);                                       //调用输入函数,输入a链表
        input(b, 2);                                       //调用输入函数,输入b链表
        print(del(a, b));                               //调用输出函数,参数为删除结点函数的返回指针值
        system("pause");
        return 0;
    }
    //输入函数
    void input(Student *stu, int n)
    {
        Student *p;
        int i;
        for (p=stu, i=0; p<stu+n; p++, i++){
            printf("Please enter No.%d student info: ", i+1);
            scanf("%d %s", &p->num, p->name);
            i==n-1 ? stu[i].next=NULL : stu[i].next=&stu[i+1];
        }
    }
    //输出函数
    void print(Student *stu)
    {
        Student *p;
        for (p=stu; p!=NULL; p=p->next)
            printf("%d %s\n", p->num, p->name);
    }
    //删除结点函数
    Student *del(Student *stu1, Student *stu2)
    {
        Student *p, *q, *head;
        int i;
        for (p=stu1, head=p, i=1; p!=NULL; p=p->next)
            for (q=stu2; q!=NULL; q=q->next)
                if (p->num==q->num){                    //判断学号是否相符
                    if (head==p)                        //判断是否为头指针,如果是头指针指向链表下一个地址
                        head=p->next;
                    else if (p->next==NULL)             //判断是否为尾指针,如果是尾指针指向链表上一个地址
                        (p-i)->next=NULL;               //i的作用是判断链表之前是否有删除的结点
                    else{                               //除以上条件外,链表上一结点指向下一个结点
                        (p-1)->next=p->next;
                        i++;
                    }
                }
        return head;
    }
    展开全文
  • #include #include #define LEN sizeof(struct student) #define NULL 0 int n=0; struct student { int num; char name[20];...struct student *next;...struct student *creat(void) //创建学生结构体链表 { struct
  • A,B两个链表,其表中的元素递增有序,把A,B和成一个链表
  • *题目:已知两个链表A和B分别表示两个集合,其元素递增排列。 * 请设计一个算法,用于求出A与B的交集,并存放在A链表中。 *编译环境:VC 6.0 */ #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #...
  • (3)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出A与B的交集,并存放于A链表中。 [题目分析] 只有同时出现在两集合中的元素才出现在结果表中,合并后的新表使用头指针Lc指向。papb分别是...
  • 题目:已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出A与B的交集,并存放于A链表中。 void MergeList(Linklist& L1, Linklist& L2) {//都是带头结点的链表 Linklist L3, p1, p2, p3, q...
  • 15,已知两个链表A和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交集,并存放于A链表中。 思路:采用归并排序思想。在归并思想中,如果A的节点小于B的节点,就把A节点插入到一个地方,指针但是在此处,这...
  • 分析:从第一个结点开始进行比较,当两个链表LaLb均为到达表尾结点时,如果两个表中相等的元素时,摘取La表中的元素,删除Lb表中的元素;如果其中一个表中的元素较小时,删除此表中较小的元素,此表的工作指针后移...
  • 种方法完成升序链表AB的合并,并使C成为降序。 方法一:依次比较A、B的各结点,将较小的赋给C,A、B结点都赋给C后,再将C表逆序,得到降序表; 方法二:依次比较链表AB,然后将结点赋给C表,在C中表从头...
  • 有ab两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 方法:(链表统一用动态分配) #include <stdio.h> #include <stdlib.h> //声明结构体struct Student ...
  • 实现两个链表的合并

    2014-07-06 16:25:51
    (1)建立两个链表A和B 链表元素个数分别为mn个 (2)假设元素分别为 x1 x2 …xm y1 y2 …yn 把它们合并成一个线性表C 使得: 当m> n时 C x1 y1 x2 y2 …xn yn … xm 当n>m时 C y1 x1 y2 x2 …ym xm ...
  • (4)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。 [题目分析] 求...
  • 语言:C++ #include &lt;iostream&gt; using namespace std; typedef struct LNode { int data;...//创建链表 int CreateList(LinkList &amp;L,int n) { LNode *p,*r;int i; L=new LN...
  • 在链表中插入数据并将两个链表连接起来,本代码是在大学阶段我自己手写的,比较适合正在学习数据结构的朋友,简单易懂。
  • 分析:从第一个结点开始进行比较,当两个链表LaLb均为到达表尾结点时,如果La表中的元素小于Lb表中的元素,pre置为La表的工作指针pa删除Lb表中的元素;如果其中一个表中的元素较小时,删除此表中较小的元素,此表...
  • 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。  代码如下:#...
  • 本系列的第一节概括性地简单介绍了一下数据结构算法的概念,说实话有点虚,因为谁都知道链表和数组是什么,也都能说出散列二叉树,但真正难度的是,在实际开发中如何去用这些数据结构,根据不同的开发需求选择...
  • 分享一大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net /* * Created by Chimomo */ #include &lt;iostream&gt; #define ...
  • /*已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号 升序排序*/ #include <stdio.h> #include <stdlib.h> typedef struct student{ long num; float score; struct ...
  • 第一行整数n,代表链表B中元素数,接着是n整数,代表链表A中的n元素 Output 每组测试输出一行,代表链表A和链表B中元素的交集,如果交集为空则输出none Sample Input 5 2 5 8 9 20 3 5 9 10 6 1 2 3 12 ...
  • #define n 5 //定义每个链表中的结点数,即每个链表五位学生 #define LEN sizeof(struct student) //命令行,令 LEN 代表struct student类型数据的长度 typedef struct student { int nu...
  • 1.先创建两个链表; 2.把两个链表合并; 3.把合并后的链表排序; 4.输出排序后的链表 具体处理: 1.如何创建链表: 链表 = 头指针 + 节点 所以:首先,定义节点 typedef struct node { int sid; char name[20]; ...
  • 蠶需链表的合并数据结构 PAGE PAGE # 一课程设计题目: 实现两个链表的合并 二 基本功能要求 建立两个链表A和B,链表元素个数分别为mn个 假设元素分别为(xl, x2, xm,(yl, y2?yn)把它们合并成一个线性表C, 使得 当 ...
  • 问题定义:  写一个函数SortedMerge函数,该函数两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个...比如:这里有两个链表,分别是 list1: 5->10->15 list2: 2->3->20 SortedMerge函数返

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,810
精华内容 84,324
关键字:

有两个链表a和b