精华内容
下载资源
问答
  • 循环链表

    2020-10-15 22:02:36
    循环链表 单链表是一种具有方向性的结构,只能从头结点出发,依次去访问各个结点. 如果头结点被破坏或丢失,则整个单链表就会丢失,并且所占内存无法释放. 把单链表的尾结点指向头结点,使整个链表构成一环状机构,称为...

    循环链表

    • 单链表是一种具有方向性的结构,只能从头结点出发,依次去访问各个结点.
    • 如果头结点被破坏或丢失,则整个单链表就会丢失,并且所占内存无法释放.
    • 把单链表的尾结点指向头结点,使整个链表构成一个环状机构,称为循环链表(circle list)

    循环链表的结点删除

    根据删除结点的位置和结点个数,删除一个结点分三种情况:

    (1) 结点个数=1,删除头结点

    head = NULL;
    delete DelNode;
    

    (2) 结点个数>1,删除头结点

    p = head;
    while (p->next! = head) //探测指针p找到head的前一个结点
    	p = p->next;
    head = head->next;
    p->next = head;
    delete DelNode;	
    

    (3) 结点个数>1,删除非头结点

    p = head;
    while (p->next! = DelNode) //探测指针p找到DelNode的前一个结点
    	p = p->next;
    p->next = DelNode->next;
    delete DelNode;	
    

    循环链表的结点插入

    将结点InsNode插入到结点PosNode之后:
    (1) InsNode插入到head的之前

    InsNode->next = head;
    Node *p = head;
    while (p->next != head)
    	p=p->next;
    head = InsNode;
    p->next = head;	
    

    (2) 将结点InsNode插入到结点PosNode之后

    InsNode->next = PosNode->next;
    PosNode->next = InsNode;
    

    双向链表

    结点的逻辑结构:
    [ *link | data | *rlink]

    • 双向链表中的结点设置了三个域:
    • 一个数据域data用来存放结点数据信息
    • 两个指针域*link指向前一个结点, *rlink指向后一个结点.
    • 头结点 ->llink = NULL;
    • 尾结点 ->rlink = NULL;

    双向链表的结点删除

    根据删除结点的位置和结点个数,删除一个结点分四种情况:

    (1) 结点个数=1,删除头结点

    head = NULL;
    delete DelNode;
    

    (2) 结点个数>1,删除头结点

    head = head->rlink;
    head->llink = NULL;
    delete DelNode;	
    

    (3) 结点个数>1,删除尾结点

    DelNode->llink->rlink = NULL;
    delete DelNode;	
    

    (4) 结点个数>1,删除中间结点

    DelNode->rlink->llink = DelNode->llink;
    DelNode->llink->rlink = DelNode->rlink;
    delete DelNode;	
    

    双向链表的结点插入

    将结点InsNode插入到结点PosNode之后:
    (1) InsNode插入到head的之前

    head->llink = InsNode;
    InsNode->rlink = head;
    head = InsNode;
    head->llink = NULL;
    

    (2) 将结点InsNode插入到结点PosNode之后

    PosNode->rlink->llink = PosNode;
    InsNode->llink = PosNode;
    InsNode->rlink = PosNode->rlink;
    PosNode->rlink = InsNode;
    

    写于 2020-10-15

    展开全文
  • 已知由一线性链表表示的线性表中含有 3 类字符的数据元素(如:字母,数字和其他字符),试编写算法将该线性链表分割为 3 个循环链表,其中每个循环链表均只含有一类字符。 编程要求: 输入: 键盘输入一串字符,含...

    已知由一个线性链表表示的线性表中含有 3 类字符的数据元素(如:字母,数字和其他字符),试编写算法将该线性链表分割为 3 个循环链表,其中每个循环链表均只含有一类字符。

    编程要求:
    输入:
    键盘输入一串字符,含上述的 3 类字符,各类字符数目 5 个以上输出;
    屏幕分别打印循环链表 A,B,C 的元素。

    # include <stdio.h>
    # include <stdlib.h>
    
    typedef char ElemType;
    typedef struct Node
    {
    	ElemType data;
    	struct Node *next;
    }LNode,  *LinkList;
    
    void CreatList(LinkList &L,int m)//依次输入m个数据,并依次建立各个元素结点,逐个插入到链表尾;建立带表头结点的单链表La
    {
    	int i;
    	LinkList p,s;
    	L=(LinkList)malloc(sizeof(LNode));
    	L->next=NULL;
    	p=L;
    	if(m!=0)
    		printf("请依次输入%d个数据元素:\n",m-1);
    	for(i=0;i<m;i++)
    	{
    		s=(LinkList)malloc(sizeof(LNode));
    		scanf("%c",&s->data);
    		p->next=s;
    		p=p->next;
    	}
    	p->next=NULL;
    }
    void CircleList(LinkList &L)//将线性链表变为循环链表
    {
    	LinkList p;
    	int i;
    	p=L;
    	for(i=0;p->next;i++)
    		p=p->next;
    	p->next=L;
    }
    void ListPrint(LinkList L)//将链表La的数据元素从表头到表尾依次显示
    {
    	LinkList p;
    	int i;
    	p=L->next;
    	if(!p)
    		printf("输出链表失败!\n");
    	for(i=0;p;i++)
    	{
    		printf("%c",p->data);
    		p=p->next;
    	}
    	printf("\n");
    }
    void ListInsert(LinkList &L,int i,ElemType e)//在带头结点的单链表L中第i个数据元素之前插入数据元素
    {
    	LinkList s,p;
    	int j;
    	p=L;
    	for(j=0;p && j<i-1;j++)
    		p=p->next;
    	if(!p || j>i-1)
    		printf("i值错误\n");
    	s=(LinkList)malloc(sizeof(LNode));
    	s->data=e;
    	s->next=p->next;
    	p->next=s;
    }
    void Classify(LinkList L,LinkList &A,LinkList &B,LinkList &C)//将元素分类
    {
    	LinkList p;
    	int i=1,j=1,k=1;
    	p=L->next;
    	while(p)
    	{
    		if( ( (p->data)>64&&(p->data)<91) || ((p->data)>96&&(p->data)<123))
    		{
    			ListInsert(A,i++,p->data);
    		}
    		else if((p->data)>47 && (p->data)<58)
    		{
    			ListInsert(B,j++,p->data);
    		}
    		else
    		{
    			ListInsert(C,k++,p->data);
    		}
    		p=p->next;
    	}
    }
    int main()
    {
    	LinkList L,A,B,C;
    	int n;
    	printf("请输入数据元素个数: ");
    	scanf("%d",&n);
    	CreatList(L,n+1);
    	CreatList(A,0);
    	CreatList(B,0);
    	CreatList(C,0);
    	Classify(L,A,B,C);
    	printf("输出字母:\n");
    	ListPrint(A);
    	printf("输出数字:\n");
    	ListPrint(B);
    	printf("输出符号:");
    	ListPrint(C);
    	CircleList(A);
    	CircleList(B);
    	CircleList(C);
    	return 0;
    }
    
    展开全文
  • struct node { int data; node next; }int deleteNum(char *arr) { node *head = new node; head->data = 0; head->next = NULL; node *p = head; int i = 0;... //建立循环链表并赋值 for
    struct node {
        int data;
        node next;
    }
    
    int deleteNum(char *arr) {
        node *head = new node;
        head->data = 0;
        head->next = NULL;
        node *p = head;
        int i = 0;
        //建立循环链表并赋值
        for (int i=0; i<1000; i++) {
            node *temp = new node;
            temp->data = i;
            temp->next = NULL;
            head->next = temp;
            head = head->next;
        }
        head->next = p;
        //循环直到只剩一个数
        while (p != p->next) {
            p->next->next = p->next->next->next;
            p = p->next->next;
        }
        int res = p->data;
        return res;
    }
    展开全文
  • 循环链表实验

    2017-09-04 09:25:25
    (4)输出单循环链表中每一结点元素 (5)指定位置插入某个元素 (6)查找第i结点元素的值 (7)查找值为e 的结点,并返回该结点指针 (8)删除第i结点 (9)销毁单循环链表 2、实验要求 (1)程序中用户可以...
  • 这题我做了有五小时...就是没读懂题目中 "从每一数字开始一...思路:既然是循环我就构建了个循环链表,然后从M往上一个个枚举。 #include <iostream> #include <cmath> #include <stdio...

    题目:http://hustoj.sinaapp.com/problem.php?id=1843

    这题我做了有五个小时...就是没读懂题目中 "从每一个数字开始数一次" 是什么意思...

    思路:既然是循环我就构建了个循环链表,然后从M往上一个个枚举。

    #include <iostream>
    #include <cmath>
    #include <stdio.h>
    
    using namespace std;
    
    int digit[10];
    int num;
    
    struct nodes
    {
        int n;
        nodes *next;
    }node[10];
    
    
    void createlist()
    {
        nodes *c;
    
        node[0].n=digit[0];
        c=&node[0];
        for(int i=1;i<num;i++)
        {
            c->next=&node[i];
            c=c->next;
            c->n=digit[i];
        }
        c->next=&node[0];
    }
    
    int cycle(nodes * head)
    {
        int start = head->n;
        nodes *p=head,*c=head;
        for(int i=0;i<num;i++)
        {
            for(int j=0;j<p->n;j++)
            {
                c=c->next;
            }
            if(c==p) return 0;
            p=c;
            
            if(p->n==start )
            {
             
                if(i==num-1) return 1 ;
                else break;
            }        
        }
        
         return 0;
    }
    
    int main()
    {
    
        int m;
        char temp[100];
        
        cin>>m;
        for( int  i=m+1;;i++)
        {
            num=log10(i)+1;
            sprintf(temp,"%d",i);
            int isz=0;
            for(int j=0;j<num;j++)
            {
                digit[j]=temp[j]-'0';
                if(digit[j]==0)
                {
                    isz=1;
                }
            }
            if (isz) continue;
    
            bool flag = false;
            for(int j=0;j<num;j++)
            {
                for(int k=j+1;k<num;k++)
                {
                    if(digit[k]==digit[j]) flag=true;
                }
            }
            if(flag) continue;
    
            createlist();
        
            if(cycle(&node[0])) 
            {
                cout << i<<endl;
                break;
            }
        }
    
        return 0;
    }

     

    转载于:https://www.cnblogs.com/danielqiu/archive/2013/01/16/2862080.html

    展开全文
  • 双向循环链表

    2020-01-21 10:15:59
      在单向循环链表中,如果要在末尾插入一节点,必须从head一节点一节点往后查询,尽管新建节点是插入在末尾节点和起始节点之间。在节点较多的情况下,这一过程是费时的。此外,在实际应用中,有时需要逆向...
  • Java实现循环链表

    2020-03-22 23:21:24
    用Java定义一个循环链表,实现链表的基本操作: 初始化*、获取头结点、添加新元素*、删除链表元素 、获取链表元素*、查找链表元素*、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空...
  • 这道题,说难不难,说简单...//创建一单向循环链表 #include<stdio.h> #include<stdlib.h> typedef struct node{ int id; struct node * next; }node; //单向循环链表的长度 int len(node *L) { ...
  • 循环链表解决约瑟夫循环问题循环链表什么是循环链表约瑟夫循环问题循环链表解决约瑟夫循环问题C++实现运行效果 循环链表 最近开始复习数据结构,今天手写了一约瑟夫循环问题。 什么是循环链表 首尾相连的链表:...
  • 将单链表中的信息分为字符、数字、其他三个循环链表.cpp
  • 有一单向循环链表,从头开始报,报到m或者m的倍数的元素出队。根据出队的先后顺序再组成一单向循环链表。 函数的原型:void reorder(Node **head,int m); 个人以为,这题目是约瑟夫环的变种。 方法就是沿...
  • 双向链表和循环链表并用 双向链表使用前驱指针以及后继指针 循环链表就是尾指针指向头 约瑟夫环问题:n个人围成一圈,指定一数字v,从第一个人开始报,每轮报到v的选手出局,由下一人接着从头开始报,最后一...
  • 前面相关操作在这呢,这函数依托于此 //结构体 typedef struct Node { ...//将一单链表拆成3个循环链表,其中一是纯数字,一纯字母,一其他字符 Status depositeLink(LinkNode L, LinkNode *L1, ...
  • 开始的链表的的节点个数小于输入的k //3.输入的k值为0,假如k为无符号的整数,则k-1为0xFFFFFFFF//输入检测一 //1.没有判断开始的指针为空导致访问空指针访问的内存 //2.开始的链表的的节点个数小于输入的k //
  • 本文实例讲述了java采用循环链表结构求解约瑟夫问题的方法。分享给大家供大家参考。具体分析如下:这是第一次java考试的试题,对于没看过链表的同学来说就不会做,现在回头看看,还真不难。约瑟夫问题:有n个人,其...
  • 实现用户输入一个数使26个字母的排列发生变化 * 例如用户输入3,输入结果: * DEFGHIJKLMNOPQRSTUVWXYZABC * 同时需要支持负数,例如用户输入-3,输出结果: * XYZABCDEFGHIJKLMNOPQRSTUVW 假设初始链表: 插入元素...
  • 假设数字范围为m(1-9),后面字符个数为n。假设n个字符围成一圈,从第一个字母开始循环报数,当数到m以后,第m个字符就出列,知道这n个字符全都出列。最后按照出列的顺序输出这些字符,中间仍以空格隔开。取值范围:m...
  • 二、从0手写一单向循环链表 三、实现约瑟夫问题 一、什么是约瑟夫问题(Josephus Problem)? 百度百科-约瑟夫问题 以下图为例, 箭头从1开始循环数数, 具体到几自己规定, 下图为例从1到3, 然后3淘汰, 将箭头...
  • 2012-03-19 10:28 | 527055685@qq.com约瑟夫环的变体-37奴隶问题,我也用了循环链表去做#include #include #define MAX 111 //总的奴隶#define DIE 3 //K,第K要被杀typedef struct link{int value;...
  • 有一单向循环链表队列,从头开始报,当报到m或者m的倍数的元素出列,根据出列的先后顺序重新组成单向循环链表。 #include #include struct node { int value; node *next; }; void createlist...
  • 设计单循环链表

    2021-04-13 22:47:08
    (2)主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证所设计单循环链表的正确性。 本文为博主原创文章,未经博主允许...
  • 已知一单链表中的数据元素含有三类字符(即字母字符,数字字符和其它字符),试编写算法,构造三个循环链表,使每个循环链表中只含有同一类的字符,且利用原表中的结点空间作为这三表的结点空间。 实现源代码: ...
  • 循环链表

    2021-01-24 21:42:57
    循环链表游戏,到第n人出列 #include<stdio.h> #include<string.h> #include<stdlib.h> struct People { int num; struct People* next; }; struct People* creat(struct People** ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,955
精华内容 1,182
关键字:

循环链表数个数