如何创建链表c语言,C语言如何创建链表

http://www.itjxue.com  2023-01-22 09:13  来源:未知  点击次数: 

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语言创建链表

主函数这里

Linklist?List;

printf("输入创建链表的长度:");

scanf("%d",num);

CreateList_H(List,num); //创建链表

改为?

LNode?List;

printf("输入创建链表的长度:");

scanf("%d",num);

CreateList_H(List,num); //创建链表

函数内在堆上分配好内存,但是 没有传递到栈上

另外?你的变量名很迷人

如何用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}

(责任编辑:IT教学网)

更多

推荐linux文章