单链表的c语言实现完整c代码,c语言单链表程序代码

本文目录一览:

求C语言单链表 源代码

#includestdio.h

#includestdlib.h

#includestring.h

struct people

{

    char name[10];

    int age;

    struct people * next;

};

int main()

{

    struct people * head=NULL;

    struct people * prev , * current;

    int flag=1;

    while(flag!=0)

    {

        printf(“请输入学生姓名,年龄:(年龄输入0结束所有输入工作)\n”);

        current=(struct people *)malloc(sizeof(struct people));

        if(head==NULL)

            head=current;

        else

            prev-next=current;

        current-next=NULL;

        scanf(“%s”,current-name);

        scanf(“%d”,current-age);

        prev=current;

        flag=current-age;

    }

    printf(“Output:\n”);

    if(head==NULL)

        printf(“无资料。\n”);

    else

    {

        current=head;

        while(current-next!=NULL)

        {

            printf(“姓名:%s\n年龄:%d\n\n”,current-name,current-age);

            current=current-next;

        }

    }

}

至于排序,断开旧链表,将前后指针链接到新的节点就好

如果还有问题欢迎再问哈

c语言 单链表源代码

#include “stdafx.h”

#include stdio.h

#include malloc.h

typedef char ElemType;

struct LNode

{

ElemType data;

struct LNode *next;

};

//***********************************************************置空表setnull()

void setnull(struct LNode **p)

{

*p=NULL;

}

//************************************************************求长度length()

int length(struct LNode **p)

{

int n=0;

struct LNode *q=*p;

while (q!=NULL)

{

n++;

q=q-next;

}

return(n);

}

//*************************************************************取结点get()

ElemType get(struct LNode **p,int i)

{

int j=1;

struct LNode *q=*p;

while (ji q!=NULL) /**//*查找第i个结点*/

{

q=q-next;j++;

}

if (q!=NULL) /**//*找到了第i个结点*/

return(q-data);

else

{

printf(“位置参数不正确!\n”);

return NULL;

}

}

//************************************************************按值查找locate()

int locate(struct LNode **p,ElemType x)

{

int n=0;

struct LNode *q=*p;

while (q!=NULL q-data!=x) /**//*查找data域为x的第一个结点*/

{

q=q-next;

n++;

}

if (q==NULL) /**//*未找到data域等于x的结点*/

return(-1);

else /**//*找到data域等于x的结点*/

return(n+1);

}

//**********************************************************插入结点insert()

void insert(struct LNode **p,ElemType x,int i)

{

int j=1;

struct LNode *s,*q;

s=(struct LNode *)malloc(sizeof(struct LNode)); /**//*建立要插入的结点s*/

s-data=x;

q=*p;

if (i==1) /**//*插入的结点作为头结点*/

{

s-next=q;

*p=s;

}

else

{

while (ji-1 q-next!=NULL) /**//*查找第i-1个结点*/

{

q=q-next;j++;

}

if (j==i-1) /**//*找到了第i-1个结点,由q指向它*/

{

s-next=q-next; /**//*将结点s插入到q结点之后*/

q-next=s;

}

else

printf(“位置参数不正确!\n”);

}

}

//*********************************************************删除结点del()

void del(struct LNode **p,int i)

{

int j=1;

struct LNode *q=*p,*t;

if (i==1) /**//*删除链表的头结点*/

{

t=q;

*p=q-next;

}

else

{

while (ji-1 q-next!=NULL) /**//*查找第i-1个结点*/

{

q=q-next;j++;

}

if (q-next!=NULL j==i-1) /**//*找到第i-1个结点,由q指向它*/

{

t=q-next; /**//*t指向要删除的结点*/

q-next=t-next; /**//*将q之后的结点删除*/

}

else printf(“位置参数不正确!\n”);

}

if (t!=NULL) /**//*在t不为空时释放该结点*/

free(t);

}

//********************************************************显示链表display()

void display(struct LNode **p)

{

struct LNode *q;

q=*p;

printf(“单链表显示:”);

if (q==NULL) /**//*链表为空时*/

printf(“链表为空!”);

else if (q-next==NULL) /**//*链表只有一个结点时*/

printf(“%c\n”,q-data);

else { /**//*链表存在一个以上的结点时*/

while (q-next!=NULL) /**//*显示前面的结点*/

{

printf(“%c→”,q-data);q=q-next;

}

printf(“%c”,q-data); /**//*显示最后一个结点*/

}

printf(“\n”);

}

void main()

{

struct LNode *head;

setnull(head);

insert(head,’a’,1);

insert(head,’b’,2);

insert(head,’a’,2);

insert(head,’c’,4);

insert(head,’d’,3);

insert(head,’e’,1);

display(head);

printf(“单链表长度=%d\n”,length(head));

printf(“位置:%d 值:%c\n”,3,get(head,3));

printf(“值:%c 位置:%d\n”,’a’,locate(head,’a’));

printf(“删除第1个结点:”);

del(head,1);

display(head);

printf(“删除第5个结点:”);

del(head,5);

display(head);

printf(“删除开头3个结点:”);

del(head,3);

del(head,2);

del(head,1);

display(head);

}

/**//*

运行结果:

单链表显示:e→a→a→d→b→c

单链表长度=6

位置:3 值:a

值:a 位置:2

删除第1个结点:单链表显示:a→a→d→b→c

删除第5个结点:单链表显示:a→a→d→b

删除开头3个结点:单链表显示:b

*/

求一份实现单链表的基本操作的c语言程序,包括输入元素,谢谢。

#includestdlib.h

#include “nodedef.h”

#define CreateLinklistWay 1 // 0表示头插法创建链表,1表示尾插法创建链表

#if !CreateLinklistWay

/*********************************************************************

* 函数名称:linklist *CreateLinklistHead()

* 函数功能:利用头插法创建链表

* 参 数:无

* 返 回 值:创建完链表后的链表头结点

* 说 明:无

*********************************************************************/

extern linklist *CreateLinklistHead()

{

int x, i, nodeNum;

linklist *head, *temp; // 头结点与临时结点

head = (linklist *)malloc(sizeof(linklist)); // 生成表头结点

head-next = NULL; // 给表头结点的指针域赋值

printf(“请输入链表中结点的个数:”);

scanf(“%d”, nodeNum);

for(i=1; i=nodeNum; i++)

{

printf(“请输入第 %d 个结点的数据:”, i);

scanf(“%d”, x);

temp = (linklist *)malloc(sizeof(linklist)); // 生成新的结点

temp-data = x; // 对新结点的数据域赋值

// 将新结点插到头结点之后

temp-next = head-next;

head-next = temp;

}

return head; // 返回新建链表的头结点

}

#else

/*********************************************************************

* 函数名称:linklist *CreateLinklistRear()

* 函数功能:利用尾插法创建链表

* 参 数:无

* 返 回 值:创建完链表后的链表头结点

* 说 明:无

*********************************************************************/

extern linklist *CreateLinklistRear()

{

int x, i, nodeNum;

linklist *head, *rear, *temp; // 定义头结点、尾结点和临时结点

head = (linklist *)malloc(sizeof(linklist)); // 生成表头结点,表头结点不存放数据

head-next = NULL; // 将表头结点的指针域赋值为NULL

rear = head; // 将表头结点赋值给表尾结点

printf(“请输入链表中结点的个数:”);

scanf(“%d”, nodeNum);

for(i=1; i=nodeNum; i++)

{

printf(“请输入第 %d 个结点的数据:”, i);

scanf(“%d”, x);

temp = (linklist *)malloc(sizeof(linklist)); // 生成新的结点

temp-data = x; // 新增结点的数据域

temp-next = NULL; // 新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)

rear-next = temp; // 使前一个结点指向新增结点(head-next=temp)

rear = temp; // 将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head-next)

}

//rear-next = NULL; // 将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)

return head; // 返回头结点

}

#endif

用C语言实现建立一个单链表的过程,并实现打印链表中每一个元素,写出完整程序

这是个很简单的链表创建和输出

#includestdio.h

#includestdlib.h

typedef struct linkednode

{

char data;

struct linkednode *next;

}node,*link_list;//链表节点的结构及重命名

link_list creat()//创建一个链表返回类型是链表的首地址

{

link_list L;

node *p1,*p2;

char data;

L=(node*)malloc(sizeof(node));//开辟存储空间

p2=L;

while((data=getchar())!=’\n’)//输入回车键时结束输入

{

p1=(node*)malloc(sizeof(node));

p1-data=data;

p2-next=p1;

p2=p1;

}

p2-next=NULL;

return L;

}

void print(link_list L)//把链表输出

{

node *p;

p=L-next;

while(p!=NULL)

{

printf(“%c”,p-data);

p=p-next;

}

printf(“\n”);

}

void main()

{

link_list L=NULL;

char x;

printf(“请输入链表节点:\n”);

L=creat();

print(L);

}

编写一个C语言程序 实现单链表的基本操作

# include stdio.h

# include malloc.h

# include stdlib.h

typedef struct Node

{

int data;

struct Node * pNext;

} * PNODE, NODE;

PNODE establish_list (void);

void traverse_list (PNODE pHead);

bool is_empty(PNODE pHead);

int length_list(PNODE pHead);

void sort_list(PNODE pHead);

void insert_list(PNODE pHead, int pos, int val);

int delete_list(PNODE pHead, int pos, int val);

void freeer(PNODE pHead);

int main(void)

{

PNODE pHead;

int len, i, j, val;

pHead = establish_list();

traverse_list(pHead);

if(is_empty(pHead))

printf(“链表为空\n”);

else

printf(“链表不空\n”);

len = length_list(pHead);

printf(“链表的长度为: %d\n”, len);

sort_list(pHead);

traverse_list(pHead);

printf(“请输入您要在第几个节点插入\n”);

scanf(“%d”, i);

printf(“请输入您要在第%d个节点插入的值\n”, i);

scanf(“%d”, j);

insert_list(pHead, i, j);

traverse_list(pHead);

printf(“请输入您要第几个删除的节点\n”);

scanf(“%d”, i);

val = delete_list(pHead, i, val);

printf(“您删除的节点值为: %d\n”, val);

traverse_list(pHead);

freeer(pHead);

return 0;

}

PNODE establish_list(void)//初始化链表,返回头结点地址

{

int val, len;

PNODE Tem;

PNODE pNew;

PNODE pHead;

pHead = (PNODE)malloc(sizeof(NODE));

Tem = pHead;

if(NULL == pHead)

{

printf(“分配失败”);

exit(-1);

}

Tem-pNext = NULL;

printf(“请输入您要定义节点的长度: “);

scanf(“%d”, len);

for (int i=0;ilen;++i)

{

printf(“请输入第%d个节点的值: “, i+1);

scanf(“%d”, val);

pNew = (PNODE)malloc(sizeof(NODE));

if(NULL == pNew)

{

printf(“分配失败”);

exit(-1);

}

pNew-data = val;//首先把本次创建的新节点的值付给新节点的数据域

Tem-pNext = pNew;//然后使用临时的节点变量的指针域保存了新节点的地址,也就是指向了新节点

pNew-pNext = NULL;//如何再不循环,新节点成为最后一个节点

Tem = pNew;//把本次分配的新节点完全的赋给Tem,Tem就成为了这次新节点的影子,那么下次分配新节点时可以使用上个新节点的数据

}

return pHead;

}

void traverse_list(PNODE pHead)

{

PNODE p = pHead;//使用P是为了不改写头结点里保存的地址

p = pHead-pNext;//使P指向首节点

while(p != NULL)//P本来就是头结点的指针域,也就是首节点的地址,既然是地址就可以直接判断p是否等于NULL

{

printf(“%d “, p-data);

p = p-pNext;//使P每循环一次就变成P的下一个节点

}

}

bool is_empty(PNODE pHead)

{

if(NULL == pHead-pNext)

return true;

else

return false;

}

int length_list(PNODE pHead)

{

PNODE p = pHead-pNext;

int len = 0;

while(p != NULL)

{

len++;

p = p-pNext;

}

return len;

}

void sort_list(PNODE pHead)

{

int i, j, t, len;

PNODE p, q;

len = length_list(pHead);

for(i=0,p=pHead-pNext;ilen;i++,p=p-pNext)//逗号后只是为了找到下一个节点,因为不是数组,所以不能使用下标来++

{

for(j=0,q=pHead-pNext;jlen;j++,q=q-pNext)

if(q-data p-data)//这里的大小与号可以决定是升序还是降序,如果是大于号就是升序,反之小于号就是降序

{

t = q-data;

q-data = p-data;

p-data = t;

}

}

return;

}

void insert_list(PNODE pHead, int pos, int val)

{

int i;

PNODE q = pHead;

PNODE p = pHead;

if(pos 0 pos = length_list(pHead))

{

for(i=0;ipos;i++)

{

q = q-pNext;//q就是要插入的连接点

}

for(i=1;ipos;i++)

{

p = p-pNext;//p就是要插入连接点的前一个节点

}

PNODE pNew = (PNODE)malloc(sizeof(NODE));

p-pNext = pNew;

pNew-data = val;

pNew-pNext = q;

}

else if(pos length_list(pHead))//追加

{

PNODE t;

t = pHead;

PNODE PN;

PN = (PNODE)malloc(sizeof(NODE));

if(PN == NULL)

printf(“分配失败”);

else

while(t-pNext != NULL)

{

t = t-pNext;//使T-pNext成为尾结点

}

PN-data = val;//给新节点赋予有效数据

t-pNext = PN;//使尾结点的指针域指向了新的结点

PN-pNext = NULL;//新节点成为尾结点

}

else

printf(“error\n”);

return;

}

int delete_list(PNODE pHead, int pos, int val)

{

int i, j;

PNODE q, p;

q = pHead;

p = pHead;

if(pos 0 pos = length_list(pHead))//保证删除的是节点的有效数

{

for(i=0;ipos;i++)

{

p = p-pNext;

}

for(j=1;jpos;j++)

{

if(pos == 0)

q = pHead;

else

q = q-pNext;

}

q-pNext = p-pNext;

val = p-data;

free(p);

return val;

}

else

printf(“error”);

}

void freeer(PNODE pHead)

{

PNODE pT = pHead;

while(NULL != pHead-pNext)

{

free(pT);

pT = pT-pNext;

}

return;

}

/*

好久以前写的一个链表了,有排序,插入,删除,输出,判断是否为空,甚至还有释放堆中内存的功能

*/

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/227192.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-09 16:28
下一篇 2024-12-09 16:28

相关推荐

  • 利用Python实现两个链表合并为一个有序链表

    对于开发工程师来说,实现两个链表合并为一个有序链表是必须掌握的技能之一。Python语言在链表处理上非常便利,本文将从多个方面详细阐述如何利用Python实现两个链表合并为一个有序…

    编程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件并生成完整的图像

    OBJ格式是一种用于表示3D对象的标准格式,通常由一组顶点、面和纹理映射坐标组成。在本文中,我们将讨论如何将多个OBJ文件拼接在一起,生成一个完整的3D模型。 一、读取OBJ文件 …

    编程 2025-04-29
  • 打造照片漫画生成器的完整指南

    本文将分享如何使用Python编写一个简单的照片漫画生成器,本文所提到的所有代码和技术都适用于初学者。 一、环境准备 在开始编写代码之前,我们需要准备一些必要的环境。 首先,需要安…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python中文版下载官网的完整指南

    Python是一种广泛使用的编程语言,具有简洁、易读易写等特点。Python中文版下载官网是Python学习和使用过程中的重要资源,本文将从多个方面对Python中文版下载官网进行…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • 服务器安装Python的完整指南

    本文将为您提供服务器安装Python的完整指南。无论您是一位新手还是经验丰富的开发者,您都可以通过本文轻松地完成Python的安装过程。以下是本文的具体内容: 一、下载Python…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • 微信小程序和Python数据交互完整指南

    本篇文章将从多个方面介绍如何在微信小程序中实现与Python的数据交互。通过本文的学习,您将掌握如何将微信小程序与后台Python代码结合起来,实现更丰富的功能。 一、概述 微信小…

    编程 2025-04-29

发表回复

登录后才能评论