当前位置:首页 » 编程语言 » c语言算法链表

c语言算法链表

发布时间: 2023-07-14 10:48:43

Ⅰ 在C语言中,什么是链表呀

链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。

Ⅱ C语言链表的使用方法

D
答案D设置完,p就从链表中丢掉了。
p就是一个指向结构体node的指针。
p->next就是p包含的执行下一个node的指针,在本题,就是q。

Ⅲ 如何用C语言创建一个链表,实现增、删、改、查

#includex0dx0a#includex0dx0a#include x0dx0a//先定义一种student类型,表示一个学生的信息,如下:x0dx0atypedef struct studentx0dx0a{x0dx0aint num; //表示学号x0dx0achar name[30]; //表示姓名x0dx0afloat score; //表示分数x0dx0a}student;x0dx0a//定义一种NODE类型,表示一个结点信息,如下:x0dx0atypedef struct nodex0dx0a{x0dx0astudent st; //表示一个学生的信息x0dx0astruct node *next; //表示一个NODE类型的指针x0dx0a}NODE;x0dx0a//1、写出建立一颂老个带头结点的线性链表的函数,侍樱乱其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:x0dx0aNODE *creat_link(int direction)x0dx0a{x0dx0aNODE *head,*p,*tail;x0dx0aint xh,i=1;x0dx0aif(direction==1) //当direction的值为1时,新建立的结点连到尾部x0dx0a{x0dx0atail=head=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("请输入第%d个学生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("请输入第%d个学生的成绩:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=NULL;x0dx0atail->next=p;x0dx0atail=p;x0dx0ai=i+1;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0aelse if(direction==0) //当direction为0时,新建立的结点成为第一个结点x0dx0a{x0dx0ahead=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //从键盘临时输入学生情况,老档当输入的学号非正,则链表建立完毕x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("请输入第%d个学生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("请输入第%d个学生的成绩:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=head->next;x0dx0ahead->next=p;x0dx0ai=i+1;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0areturn head;x0dx0a}x0dx0a//2、写出输出上述链表各结点数据域值的函数。该函数对应的函数需要一个形参,表示链表的头指针,形式如下:x0dx0avoid print_link(NODE *head)x0dx0a{x0dx0aNODE *p;x0dx0ap=head->next;x0dx0aprintf("%-10s%-20s%-10s\n","学号","姓名","分数");x0dx0awhile(p!=NULL)x0dx0a{x0dx0aprintf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score);x0dx0ap=p->next;x0dx0a}x0dx0a//该函数能输出head所指的链表的所有结点值,输出形式如下:x0dx0a/*本函数输出线性表sq中所有数据,形式如下:x0dx0a学号 姓名 分数x0dx0a12 张三 234.5x0dx0a18 李四 987.7x0dx0a??? ??? ??.*/x0dx0a}x0dx0a//3、写出在链表中删除结点的函数x0dx0aint del_link(NODE *head,char name[])x0dx0a{x0dx0aNODE *p,*p1;x0dx0ap=head->next;x0dx0ap1=head;x0dx0awhile(p!=NULL)x0dx0a{x0dx0aif(strcmp(p->st.name,name)!=0)x0dx0a{x0dx0ap1=p;x0dx0ap=p->next;x0dx0a}x0dx0aelsex0dx0a{x0dx0abreak;x0dx0a}x0dx0a}x0dx0aif(p!=NULL)x0dx0a{x0dx0ap1->next=p->next;x0dx0afree(p);x0dx0areturn 1;x0dx0a}x0dx0aelsex0dx0a{x0dx0areturn 0;x0dx0a}x0dx0a//删除head所指的链表中,名字为name的结点,删除成功返回1,不成功返回0x0dx0a}x0dx0a//4、写出在链表中插入结点的算法x0dx0aint insert(NODE *head,student x,int wz)x0dx0a{x0dx0aNODE *p=head;x0dx0aint i=0,jg;x0dx0aif(wz<=0)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aelsex0dx0a{x0dx0awhile(inext;x0dx0a}x0dx0aif(p==NULL)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aif(i=wz-1)x0dx0a{x0dx0a//找到wz前面的节点,p指向它x0dx0aNODE *q;x0dx0aq=(NODE *)malloc(sizeof(NODE));x0dx0aq->st.num=x.num;x0dx0astrcpy(q->st.name,x.name);x0dx0aq->st.score=x.score;x0dx0aq->next=p->next;x0dx0ap->next=q;x0dx0ajg=1;x0dx0a}x0dx0a}x0dx0areturn jg;x0dx0a//该函数能够在wz这个结点之前,插入一个新结点,新结点的数据域为x。插入成功返回1,不成功返回0。x0dx0a}x0dx0a//5、写出主函数,分别调用上面算法所对应的程序,建立链表,并输出链表的值。x0dx0avoid main()x0dx0a{x0dx0aNODE *head; //定义指针变量headx0dx0aint wz; //表示插入位置x0dx0achar xm[30];x0dx0astudent st; //定义一个变量st,用来表示一个学生的信息x0dx0ahead=creat_link(1);x0dx0aprint_link(head); //调用函数建立链表,并把返回值送给head;x0dx0a//调用函数,输出链表中各个结点的值x0dx0a//输入一个学生的有关信息,送给变量st的有关成员x0dx0aprintf("\n\n请输入要插入的位置:");x0dx0ascanf("%d",&wz); //输入wz的值x0dx0aprintf("请输入要插入的学生的学号:");x0dx0ascanf("%d",&st.num);x0dx0aprintf("请输入要插入的学生的姓名:");x0dx0ascanf("%s",st.name);x0dx0aprintf("请输入要插入的学生的成绩:");x0dx0ascanf("%f",&st.score); x0dx0a//调用函数,在链表中把学生st的值作为一个结点插入,如果插入成功,输出新链表x0dx0aif(insert(head,st,wz)==1)x0dx0a{x0dx0aprintf("\n插入成功,新表为:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("插入不成功");x0dx0a}x0dx0a//调用函数,在链表中删除一个指定结点的值,如果删除成功,输出新链表x0dx0aprintf("\n\n请输入要删除的学生的姓名:");x0dx0agetchar();x0dx0agets(xm);x0dx0aif(del_link(head,xm)==1)x0dx0a{x0dx0aprintf("\n删除成功,新表为:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("删除不成功");x0dx0a}x0dx0a}

Ⅳ C语言做链表的排序

主要修改了sort函数,采用冒泡排序算法进行排序的。
你其他的两个函数写的不错,就sort函数写的有问题,已经很不错了。
注意:程序结束,最好对链表进行销毁,否则,内存永远也不会释放,导致内存泄漏了。

修改如下:

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

#define N 5
typedef struct node
{
char name[20];
int score;
struct node *link;
}stud;

stud *sort(stud *head) /*排序函数*/
{
stud *temp=NULL; //默认为NULL,也就是链表的结尾
stud *ptr1=head;
stud *ptr2=head->link;

while(ptr1->link!=temp)//(ptr1!=NULL)
{
//ptr2=ptr1->link; //放在循环体下面了
while(ptr2->link!=temp)//(ptr2!=NULL)
{
if(ptr1->link->score > ptr2->link->score) //(ptr1->score > ptr2->score)
{//交换 ptr1->link和ptr2->link,而不是ptr1和ptr2,否则无法交换
ptr1->link=ptr2->link;
ptr2->link=ptr2->link->link;//temp->link=ptr2;
ptr1->link->link=ptr2;//ptr2->link=ptr1;
}
ptr1=ptr1->link;//ptr2=ptr2->link;
ptr2=ptr1->link;//从上面移动下来的
}
temp=ptr2;//新加的
ptr1=head;//ptr1=ptr1->link;
ptr2=ptr1->link;//从上面移动下来的
}
return (head);
}

stud * creat(int n)
{
stud *p,*h,*s;
int i;

if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
s->link=NULL;//p->link=s; //跟下句对调了一下,为了把相关的代码放在一起
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name);
printf("请输入第%d个人的分数",i+1);
scanf("%d",&s->score);
p->link=s; //s->link=NULL;//跟上句对调了一下,为了把相关的代码放在一起
p=s;
}
return(h);
}

void print(stud *h)
{
stud *p;

p=h->link;
printf("数据信息为:\n");
while(p!=NULL)
{
printf("%s ",&*(p->name));
printf("的分数为%d\n",p->score);
p=p->link;
}
}

void main()
{
stud *head;
head=creat(N);
head=sort(head);
print(head);
getchar();
}

Ⅳ 如何用C语言编写一个链表

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

struct Node
{
int data;//数据域
struct Node * next;//指针域
};

/*************************************************************************************
*函数名称:Create
*函数功能:创建链表.
*输入:各节点的data
*返回值:指针head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函数名称:insert
*函数功能:在链表中插入元素.
*输入:head 链表头指针,p新元素插入位置,x 新元素中的数据域内容
*返回值:无
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函数名称:del
*函数功能:删除链表中的元素
*输入:head 链表头指针,p 被删除元素位置
*返回值:被删除元素中的数据域.如果删除失败返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函数名称:print
*函数功能:打印链表中的元素
*输入:head 链表头指针
*返回值:无
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函数名称:main
*函数功能:主函数创建链表并打印链表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}

Ⅵ C语言单链表算法问题

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L);
void ListDeleteMax(LinkList L,int *e);
int ListInsert(LinkList L,int i,int e);
void DestroyList(LinkList L);
void ListTraverse(LinkList L);
int main(void)
{
LinkList L;
int i,j,m;
int a[]={6,5,4,3,2,1};
InitList(&L);
for(i=0; i<6; ++i)
m = ListInsert(L,i+1,a[i]);
printf("链表的内容为:");
ListTraverse(L);
ListDeleteMax(L,&j);
printf("删除最大元素%d后,链表的内容为:",j);
ListTraverse(L);
DestroyList(L);
return 0;
}
void InitList(LinkList *L)
{
*L = (LinkList )malloc(sizeof(LNode));
if(!*L)
exit(-1);
(*L)->next = NULL;
}
int ListInsert(LinkList L,int i,int e)
{
int j=0;
LinkList p = L;
LinkList s;
while(p&&j<i-1)
{
p = p->next;
j++;
}
if(!p || j>i-1)
{
return 0;
}
s = (LinkList)malloc(sizeof(LNode));
s ->data = e;
s->next = p->next;
p->next = s;
return 1;
}
void ListDeleteMax(LinkList L,int *e) //删除最大元素
{
LinkList p = L->next;
LinkList s = L; //s指向最大结点前面的结点
LinkList q;
int m = p->data; //m保存最大的值
while(p->next)
{
q=p->next;
if(q->data > m)
{
m = q->data;
s = p;
}
p=p->next;
}
q = s->next;
s->next = q->next;
*e = q->data;
free(q);
}
void DestroyList(LinkList L)
{
LinkList q;
while(L)
{
q = L->next;
free(L);
L = q;
}
}
void ListTraverse(LinkList L)
{
LinkList p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}

Ⅶ C语言里的链表

首先你要明白链表是什么,链表中有1个数据区域和1个指针区域,指针区域存放的是下一个节点的地址(如果有下个节点的话),这是单链表,如果是双链表的话,那么有2个指针区域,1个指向前1个节点的地址,1个指向后1个节点的地址,如果对链表不是很熟悉,得先去看看数据结构,链表并不是数据结构里面的东西。
接下来我们看看在C语言中如何表示链表。
typedef struct Linklist
{
int data;
struct Linklist * next;
}Linklist;
定义一个结构体来表示链表,int data 代表数据,根据实际情况自己修改,struct Linklist * next 代表指针,指向下1个节点的,比如现在有3个节点A B C ,如果他们的next为NULL ,这3个节点就是毫无关系的,分散的,如果定义A->next =&B B->next=&C 那么他们就变成链表了,即A->B->C
如果是双链表,那么在结构体中定义的时候加上struct Linklist * prev 这个指针指向前1个节点的地址,比如A->next=&B B->prev=&A 那么现在双链表就为A B相互指向,这里不好画出来就没画了。
至于链表的添加,删除之类的可以再看看C语言里面的,如果还不会在来问我吧~

热点内容
硬件哪个配置性价比高 发布:2025-02-08 14:47:07 浏览:142
如何去掉仅限自动配置 发布:2025-02-08 14:37:55 浏览:704
压缩空气有啥 发布:2025-02-08 14:26:01 浏览:703
python输入一个数 发布:2025-02-08 14:26:00 浏览:451
普惠e卡最初密码是多少 发布:2025-02-08 14:21:57 浏览:475
亚索后q脚本 发布:2025-02-08 14:21:06 浏览:324
官方源码 发布:2025-02-08 14:09:25 浏览:437
python过滤器 发布:2025-02-08 14:05:06 浏览:618
火山币算法 发布:2025-02-08 14:04:49 浏览:669
jffs2解压 发布:2025-02-08 13:55:15 浏览:388