C语言单向循环链表的建立

2023-11-20

1.头文件

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

typedef struct Link{
    int data;
    struct Link *next;
}link;

2.功能函数

link *link_init(void)
{
    link *p = (link *)malloc(sizeof(link));
    p->next = p;
    return p;
}

//头插
void link_insert(link *head,int value)
{
    link *node = (link *)malloc(sizeof(link));
    node->next = head->next;
    head->next = node;
    node->data = value;
 
}

//尾插
void link_Insert(link *head,int value)
{
    link *node = (link *)malloc(sizeof(link));
    link *temp = head;
    while(temp->next != head)
    {
	temp = temp->next;
    }
    temp->next = node;
    node->data = value;
    node->next = head;
}

//删除
void link_del(link *head,int value)
{
    int ret = link_find(head,value);
    if(ret == -1)
    {
	printf("不存在这个数\n");
	return;
    }
    link *temp = head;
    link *q;
    int i;
    for(i = 0;i < ret;i++)
    {
	if(temp->next->data == value)
	{
	    q = temp->next;
	    temp->next = temp->next->next;
	    free(q);
	    break;
	}else
	{
	    temp = temp->next;
	}
    }

}
//修改
void link_change(link *head,int old,int new)
{
    int ret = link_find(head,old);
    if(ret == -1)
    {
	printf("不存在这个数\n");
	return;
    }
    link *temp = head->next;
    int i;
    for(i = 0;i < ret;i++)
    {
	if(temp->data == old)
	{
	    temp->data = new;
	}else
	{
	    temp = temp->next;
	}
    }


}

//查找
int link_find(link *head,int value)
{
    link *temp = head->next;
    int ret = 1;
    while(temp != head)
    {
	if(temp->data == value)
	{   
	    break;

	}else
	{
	    temp = temp->next;
	    ret++;
	}

    }
    if(temp == head)
    {
	return -1;
    }else
    {
	return ret;
    }

    
}

//逆转
void link_ni(link *head)
{
    link *newhead = head->next;
    link *q;
    head->next = NULL;
    while(newhead != NULL)
    {
	q = newhead;
	link_insert(head,q->data);
	newhead = newhead->next;
	free(q);
    } 
}

//中间插入
void link_zjinsert(link *head,int value)
{
    int ret = link_length(head);
    int x;
    printf("请选择插入数据的位置\n");
    scanf("%d",&x);
    if(x > ret && x < 0)
    {
	printf("插入位置不存在\n");
	return;
    }
    link *temp = (link *)malloc(sizeof(link));
    temp->data = value;
    link *q;
    int i;
    for(i = 0;i < x;i++)
    {
	if(i == x-1)
	{
	    temp->next = q->next;
	    q->next = temp;

	}else
	{
	    q = q->next;
	}
    }
}

//链表长度
int link_length(link *head)
{
    link *temp = head->next;
    int ret = 1;
    while(temp != head)
    {
	temp = temp->next;
	ret++;
    }
    return ret;

}

//找n出局
void link_n(link *head,int n)
{
    link *temp = head->next;
    link *q;
    int i = 1;
    while(head->next->next != head)
	{
	    
	    if(temp == head)
	    {
		temp = temp->next;
	    }
	    else
	    {
		temp = temp->next;
		i++;
	    }

	    if((i % n) == 0)
	    {	
		q = temp;
		temp = temp->next;
		free(q);
		i++;
		
	    }

	}
}

//打印
void link_show(link *head)
{
    link *temp = head->next;
    while(temp != head)
    {
	printf("%d  ",temp->data);
	temp = temp->next;
    }
    printf("\n");
}

3主函数

int main(void)
{
    link *head = link_init();
    link_insert(head,1);
    link_insert(head,2);
    link_insert(head,3);
    link_insert(head,4);
    link_insert(head,5);
    link_show(head);
    link_Insert(head,10);
    link_Insert(head,9);
    link_Insert(head,8);
    link_Insert(head,7);
    link_Insert(head,6);
    link_show(head);
    /*
    printf("请输入要查找的数\n");
    int n;
    scanf("%d",&n);
    int ret = link_find(head,n);
    if(ret == -1)
    {
	printf("查找失败\n");
    }else
    {
    printf("在链表第%d位\n",ret);
    }

    printf("请输入要删除的数\n");
    int a;
    scanf("%d",&a);
    link_del(head,a);
    link_show(head);

    int b,c;
    printf("请输入要修改的数,和更新的数\n ");
    scanf("%d%d",&b,&c);
    link_change(head,b,c);
    link_show(head);

    printf("链表逆转\n");
    link_ni(head);
    link_show(head);

    printf("中间插入\n");    
    link_zjinsert(head,29);
    link_show(head);
*/    
    link_n(head,3);
    link_show(head);
    
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言单向循环链表的建立 的相关文章

  • 警告:从指针目标类型中丢弃“const”限定符

    没有const char s意味着 s 是一个指向常量 char 的指针 那么为什么它给我这个警告 我并不是想改变价值观 在第一个函数中警告是return discards const qualifiers from pointer tar
  • C#9 顶级语句文件上的属性

    我正在尝试向顶级语句文件添加属性 但没有找到任何相关信息 是否可以 对于某些上下文 我想仅在该文件中禁用规则 SuppressMessage StyleCop CSharp LayoutRules SA1516 ElementsMustBe
  • 在 MVC 类上创建主键字段

    我是 MVC 和 C 新手 我只是偶然发现它并发现它很有趣 我遇到了一个不允许我继续的问题 这是我的代码 using System using System Collections Generic using System Linq usi
  • WPF - 按多列排序时使用自定义比较器

    我有一个 ListView GridView 我想按 2 列排序 因此如果第 1 列中有 2 个以上的项目具有相同的值 它将按第 2 列排序 非常简单 但是在对 A Z 进行排序时 空字符串会出现在顶部 我想把它们移到底部 我制作了一个比较
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • C# ConfigurationManager 从 app.config 检索错误的连接字符串

    我有一个简单的 WinForms 应用程序 它最终将成为一个游戏 现在 我正在研究它的数据访问层 但遇到了障碍 我创建了一个单独的项目 名为DataAccess在其中 我创建了一个本地 mdfSQL Server 数据库文件 我还创建了一个
  • 禁用除滚动之外的 DataGridView

    我如何配置 datagridview 以便用户只能在行中移动并使用滚动 而没有其他 如果我禁用网格不允许我使用滚动 将您的 datagridview 设置为只读 这将禁用任何编辑 dataGridView1 ReadOnly true 在你
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • 我们应该使用 Eval 还是 Databind 事件?

    当使用 Asp Net 并使用 ListView 等控件创建网站时 使用 Eval 命令是一个好习惯吗 还是应该在 databind 事件中填充文字和数据 取决于您是否想在更新事件上写回数据 在这种情况下数据绑定 如果您只想读取该数据 可以
  • 在 C++ 中处理音频缓冲区时,如何执行从 float -> double -> float 的转换

    我目前正在开发一个应用程序 其中音频样本帧在以下回调中进行处理 void Eav07AudioProcessor processBlock AudioSampleBuffer buffer for int channel 0 channel
  • 为什么在 .net 中使用 Invoke on Controls? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 NET不允许跨线程操作 https stackoverflow com questions 2896504 why net does not allow cross thread operat
  • 从存储过程返回 int 值并在 ASP.NET 代码中检查它以验证登录表单

    当我多次尝试但没有得到有效结果时 使此代码运行的真实顺序是什么 SQL存储过程的代码 set ANSI NULLS ON set QUOTED IDENTIFIER ON GO ALTER PROC dbo login proc usern
  • 函数模板重载解析期间的 MSVC 与 Clang/GCC 错误,其中一个函数模板包含参数包

    当我使用参数包时 我注意到这样一种情况 如下所示 在 gcc 和 clang 中编译得很好 但在 msvc 中却不行 template
  • 语义问题 Qt Creator:命名空间“std”中没有名为“cout”的成员

    我开始使用 Qt Creator 编写代码 对于 C 文件 我遇到很多语义问题 99 是 命名空间 yyy 中没有名为 xxx 的成员cpp文件构建 编译和输出没有问题 如果我点击例如cout 我已链接到 iostream 我是否需要在 Q
  • fscanf 和 EOF 中的否定扫描集

    我的文件中有一个以逗号分隔的字符串列表 姓名 1 姓名 2 姓名 3 我想跳过所有逗号来阅读这些名字 我写了以下循环 while true if fscanf file my string 1 break 然而 它总是比预期多执行一次 给定
  • C# - 命名空间内的类型声明

    在命名空间内而不是在类中声明类型的可能用途是什么 For ex namespace Test public delegate void Ispossible 这是有效的并且不会产生任何编译错误 但我无法想象为什么我们会以这种方式声明它而不是
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • 请解释为什么Java和C对此代码给出不同的答案

    public class Test public static void main String args int i 10 i i System out println value of i is i 输出是 10 当我在中执行类似的代码

随机推荐