创建链表(创建链表的函数怎么写)

本篇文章给大家谈谈创建链表,以及创建链表的函数怎么写对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何C语言创建单链表

C语言创建单链表如下:

#include"stdio.h"

#include"stdlib.h"

#include"malloc.h"

#include "iostream.h"

typedef struct node

{

int  data;

node * next;

}node , * List;

void create(int n)

{

int c;

List s,L;

L=(List)malloc(sizeof(node));

L-next=NULL;

printf("请输入第1个数据:");

scanf("%d",c);

L-data=c;

for(int i=2;i=n;i++)

{

s=(List)malloc(sizeof(node));

printf("请输入第%d个数据:",i);

scanf("%d",c);

s-data=c;

s-next=L;

L-next =s;

}

printf("链表创建成功!"亏慎);

}

void main()

{

int n;

printf("请你输入链表的个数:");

scanf("%d",n);

create(n);

}

单链表销胡敬创建方法:

单链表的建立有头插法、尾插法两种方法。

1. 头插法

单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点。

由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立做亮一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。

链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。

2. 尾插法

若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。

建立一个链表

//c语言实现链表的建立,按逆序复笑高制

#includestdio.h

#includestdlib.h

struct node

{

int info;//节点信息

struct node *next;

};

struct node *Create(int *numnode)

{//创建一个链表

struct node *head,*tail,*cnew;

head=NULL;

int num;

printf("输入数据(以零结束):");

while(1)

{

scanf("%d",num);

if(num==0)//输入为零表示输入结束

break;

cnew=(struct node*)malloc(sizeof(struct node));

cnew-info=num;

cnew-next=NULL;

if(head==NULL)//若为空则将头节点指向新节点

head=cnew;

else

tail-next=cnew;//将当前节点的next指向新的节点

tail=cnew;

(*numnode)++;

}

return head;

}

struct node *ReverseCopy(struct node *head1,int *numnode)

{//复制链表函数反向复制

struct node *p,*head,*q;

head=NULL;//初始化为空

for(q=head1;q!=NULL;q=q-next)

{//根据head1链表来建立新的链表

p=(struct node *)malloc(sizeof(struct node));

p-info=q-info;//将head1链表的数据元素复制到新的节点中

p-next=head;//将新节点的的next指向头节点

head=p;

//将head移向新的节点,for语句结束head就指向了最后建立的节点处即head1的最后一个节点处

//每次插入都是在head和新节点之间移动

(*numnode)++;

}

return head;

}

void show(struct node *head)

{//遍历链表输出

struct node *p;

if(head==NULL)

{

printf("链表为空,没有数据\n");

return;

}

printf("\n-----链棚升罩表的数据元素------\n");

for(p=head;p!=NULL;p=p-next)

printf("%d ",p-info);

printf("\n");

}

int main()

{

struct node *head1,*head2;

int numnode1,numnode2;

numnode1=numnode2=0;

head1=head2=NULL;

//初始化将节点个数初始化为零

head1=Create(numnode1);

show(head1);

printf("\n链表head1的节点个数链闹为:%d\n",numnode1);

head2=ReverseCopy(head1,numnode2);

//调用复制函数,完成复制

show(head2);

printf("\n链表head2的节点个数为:%d\n",numnode2);

return 0;

}

[img]

C语言 关于链表的创建

#include stdio.h

#include stdlib.h

typedef int elemtype;

typedef struct Lnode {

elemtype data;

Lnode *next;

}Lnode;

Lnode *CreatList(Lnode *Head) {

Head = (Lnode *)malloc(sizeof(Lnode));

Head-next = NULL;

Lnode *p = Head;

printf("冲咐败请输入散颤元素的个数:");

int i,n;

scanf("%d", n);

for(i = 0; i  n; ++i) {

p-next = (Lnode 简羡*)malloc(sizeof(Lnode));

printf("请输入第%d个元素:",i + 1);

scanf("%d", p-next-data);

p = p-next;

}

p-next = NULL;

return Head;

}

void AllList(Lnode *head) {

Lnode *p = head-next;

while(p) {

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

p = p-next;

}

printf("\n");

}

int main() {

Lnode *head = NULL;

head= CreatList(head);

AllList(head);

return 0;

}

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

#include\x0d\x0a#include\x0d\x0a#include \x0d\x0a//先定义一种student类型,表示一个学生的信息,如下:\x0d\x0atypedef struct student\x0d\x0a{\x0d\x0aint num; //表示学号\x0d\x0achar name[30]; //表示姓名\x0d\x0afloat score; //表示分数\x0d\x0a}student;\x0d\x0a//定义一种NODE类型,表示一个结点信息,如下:\x0d\x0atypedef struct node\x0d\x0a{\x0d\x0astudent st; //表示一个学生的信息\x0d\x0astruct node *next; //表示一个NODE类型的指针\x0d\x0a}NODE;\x0d\x0a//1、写出建立一颂老个带头结点的线性链表的函数,侍樱乱其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:\x0d\x0aNODE *creat_link(int direction)\x0d\x0a{\x0d\x0aNODE *head,*p,*tail;\x0d\x0aint xh,i=1;\x0d\x0aif(direction==1) //当direction的值为1时,新建立的结点连到尾部\x0d\x0a{\x0d\x0atail=head=(NODE *)malloc(sizeof(NODE));\x0d\x0ahead-next=NULL;\x0d\x0aprintf("请输入第%d个学生的学号:",i);\x0d\x0ascanf("%d",xh);\x0d\x0awhile(xh0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕\x0d\x0a{\x0d\x0ap=(NODE *)malloc(sizeof(NODE));\x0d\x0ap-st.num=xh;\x0d\x0aprintf("请输入第%d个学生的姓名:",i);\x0d\x0ascanf("%s",p-st.name);\x0d\x0aprintf("请输入第%d个学生的成绩:",i);\x0d\x0ascanf("%f",p-st.score);\x0d\x0ap-next=NULL;\x0d\x0atail-next=p;\x0d\x0atail=p;\x0d\x0ai=i+1;\x0d\x0aprintf("请输入第%d个学生的学号:",i);\x0d\x0ascanf("%d",xh);\x0d\x0a}\x0d\x0a}\x0d\x0aelse if(direction==0) //当direction为0时,新建立的结点成为第一个结点\x0d\x0a{\x0d\x0ahead=(NODE *)malloc(sizeof(NODE));\x0d\x0ahead-next=NULL;\x0d\x0aprintf("请输入第%d个学生的学号:",i);\x0d\x0ascanf("%d",xh);\x0d\x0awhile(xh0) //从键盘临时输入学生情况,老档当输入的学号非正,则链表建立完毕\x0d\x0a{\x0d\x0ap=(NODE *)malloc(sizeof(NODE));\x0d\x0ap-st.num=xh;\x0d\x0aprintf("请输入第%d个学生的姓名:",i);\x0d\x0ascanf("%s",p-st.name);\x0d\x0aprintf("请输入第%d个学生的成绩:",i);\x0d\x0ascanf("%f",p-st.score);\x0d\x0ap-next=head-next;\x0d\x0ahead-next=p;\x0d\x0ai=i+1;\x0d\x0aprintf("请输入第%d个学生的学号:",i);\x0d\x0ascanf("%d",xh);\x0d\x0a}\x0d\x0a}\x0d\x0areturn head;\x0d\x0a}\x0d\x0a//2、写出输出上述链表各结点数据域值的函数。该函数对应的函数需要一个形参,表示链表的头指针,形式如下:\x0d\x0avoid print_link(NODE *head)\x0d\x0a{\x0d\x0aNODE *p;\x0d\x0ap=head-next;\x0d\x0aprintf("%-10s%-20s%-10s\n","学号","姓名","分数");\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0aprintf("%-10d%-20s%-10.1f\n",p-st.num,p-st.name,p-st.score);\x0d\x0ap=p-next;\x0d\x0a}\x0d\x0a//该函数能输出head所指的链表的所有结点值,输出形式如下:\x0d\x0a/*本函数输出线性表sq中所有数据,形式如下:\x0d\x0a学号 姓名 分数\x0d\x0a12 张三 234.5\x0d\x0a18 李四 987.7\x0d\x0a??? ??? ??.*/\x0d\x0a}\x0d\x0a//3、写出在链表中删除结点的函数\x0d\x0aint del_link(NODE *head,char name[])\x0d\x0a{\x0d\x0aNODE *p,*p1;\x0d\x0ap=head-next;\x0d\x0ap1=head;\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0aif(strcmp(p-st.name,name)!=0)\x0d\x0a{\x0d\x0ap1=p;\x0d\x0ap=p-next;\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0abreak;\x0d\x0a}\x0d\x0a}\x0d\x0aif(p!=NULL)\x0d\x0a{\x0d\x0ap1-next=p-next;\x0d\x0afree(p);\x0d\x0areturn 1;\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0areturn 0;\x0d\x0a}\x0d\x0a//删除head所指的链表中,名字为name的结点,删除成功返回1,不成功返回0\x0d\x0a}\x0d\x0a//4、写出在链表中插入结点的算法\x0d\x0aint insert(NODE *head,student x,int wz)\x0d\x0a{\x0d\x0aNODE *p=head;\x0d\x0aint i=0,jg;\x0d\x0aif(wznext;\x0d\x0a}\x0d\x0aif(p==NULL)\x0d\x0a{\x0d\x0ajg=0;\x0d\x0a}\x0d\x0aif(i=wz-1)\x0d\x0a{\x0d\x0a//找到wz前面的节点,p指向它\x0d\x0aNODE *q;\x0d\x0aq=(NODE *)malloc(sizeof(NODE));\x0d\x0aq-st.num=x.num;\x0d\x0astrcpy(q-st.name,x.name);\x0d\x0aq-st.score=x.score;\x0d\x0aq-next=p-next;\x0d\x0ap-next=q;\x0d\x0ajg=1;\x0d\x0a}\x0d\x0a}\x0d\x0areturn jg;\x0d\x0a//该函数能够在wz这个结点之前,插入一个新结点,新结点的数据域为x。插入成功返回1,不成功返回0。\x0d\x0a}\x0d\x0a//5、写出主函数,分别调用上面算法所对应的程序,建立链表,并输出链表的值。\x0d\x0avoid main()\x0d\x0a{\x0d\x0aNODE *head; //定义指针变量head\x0d\x0aint wz; //表示插入位置\x0d\x0achar xm[30];\x0d\x0astudent st; //定义一个变量st,用来表示一个学生的信息\x0d\x0ahead=creat_link(1);\x0d\x0aprint_link(head); //调用函数建立链表,并把返回值送给head;\x0d\x0a//调用函数,输出链表中各个结点的值\x0d\x0a//输入一个学生的有关信息,送给变量st的有关成员\x0d\x0aprintf("\n\n请输入要插入的位置:");\x0d\x0ascanf("%d",wz); //输入wz的值\x0d\x0aprintf("请输入要插入的学生的学号:");\x0d\x0ascanf("%d",st.num);\x0d\x0aprintf("请输入要插入的学生的姓名:");\x0d\x0ascanf("%s",st.name);\x0d\x0aprintf("请输入要插入的学生的成绩:");\x0d\x0ascanf("%f",st.score); \x0d\x0a//调用函数,在链表中把学生st的值作为一个结点插入,如果插入成功,输出新链表\x0d\x0aif(insert(head,st,wz)==1)\x0d\x0a{\x0d\x0aprintf("\n插入成功,新表为:\n");\x0d\x0aprint_link(head);\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("插入不成功");\x0d\x0a}\x0d\x0a//调用函数,在链表中删除一个指定结点的值,如果删除成功,输出新链表\x0d\x0aprintf("\n\n请输入要删除的学生的姓名:");\x0d\x0agetchar();\x0d\x0agets(xm);\x0d\x0aif(del_link(head,xm)==1)\x0d\x0a{\x0d\x0aprintf("\n删除成功,新表为:\n");\x0d\x0aprint_link(head);\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("删除不成功");\x0d\x0a}\x0d\x0a}

如何创建单链表?

建立单链表的常用方法有两种:头插法建表、桥乱尾插法建表

建立单链耐消差表的常用方法有两种。下面以顺序存储为例来叙述。

(1) 头插法建表

该方法从一个空表开始,读取数组a中的字符,生成新结点,将读取的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束为止。算法如下:

void CreateListF(Snode *L, ElemType a[], int n)

{ Snode *s; int i;

L = (Snode *) malloc(sizeof(Snode));

L-next = NULL;

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

{  s = (Snode *)malloc(sizeof(Snode));

s-data = a[i];

s-next = L-next;

L-next = s;

}

}

(2) 尾插法建表

头插法建立链表虽然算法简单,但生成的链表中结昌皮点的次序和原数组元素的顺序相反,若希望两者次序一致,可采用尾插法。该方法是将新结点插到当前链表的表尾上,为此必须增加一个尾指针r,使其始终指向当前链表的尾结点。算法如下:

void CreateListR(Snode *L, ElemType a[], int n)

{ Snode *s, *r; int i;

L = (Snode *) malloc(sizeof(Snode));

L-next = NULL;

r = L;

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

{  s = (Snode *)malloc(sizeof(Snode));

s-data = a[i];

r-next = s;

r = s;

}

r- next = NULL;

}

关于创建链表和创建链表的函数怎么写的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表