
#include<stdioh>
#include<stringh>
#include <malloch>
//先定义一种student类型,表示一个学生的信息,如下:
typedef struct student
{
int num; //表示学号
char name[30]; //表示姓名
float score; //表示分数
}student;
//定义一种NODE类型,表示一个结点信息,如下:
typedef struct node
{
student st; //表示一个学生的信息
struct node next; //表示一个NODE类型的指针
}NODE;
//1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:
NODE creat_link(int direction)
{
NODE head,p,tail;
int xh,i=1;
if(direction==1) //当direction的值为1时,新建立的结点连到尾部
{
tail=head=(NODE )malloc(sizeof(NODE));
head->next=NULL;
printf("请输入第%d个学生的学号:",i);
scanf("%d",&xh);
while(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕
{
p=(NODE )malloc(sizeof(NODE));
p->stnum=xh;
printf("请输入第%d个学生的姓名:",i);
scanf("%s",p->stname);
printf("请输入第%d个学生的成绩:",i);
scanf("%f",&p->stscore);
p->next=NULL;
tail->next=p;
tail=p;
i=i+1;
printf("请输入第%d个学生的学号:",i);
scanf("%d",&xh);
}
}
else if(direction==0) //当direction为0时,新建立的结点成为第一个结点
{
head=(NODE )malloc(sizeof(NODE));
head->next=NULL;
printf("请输入第%d个学生的学号:",i);
scanf("%d",&xh);
while(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕
{
p=(NODE )malloc(sizeof(NODE));
p->stnum=xh;
printf("请输入第%d个学生的姓名:",i);
scanf("%s",p->stname);
printf("请输入第%d个学生的成绩:",i);
scanf("%f",&p->stscore);
p->next=head->next;
head->next=p;
i=i+1;
printf("请输入第%d个学生的学号:",i);
scanf("%d",&xh);
}
}
return head;
}
//2、写出输出上述链表各结点数据域值的函数。该函数对应的函数需要一个形参,表示链表的头指针,形式如下:
void print_link(NODE head)
{
NODE p;
p=head->next;
printf("%-10s%-20s%-10s\n","学号","姓名","分数");
while(p!=NULL)
{
printf("%-10d%-20s%-101f\n",p->stnum,p->stname,p->stscore);
p=p->next;
}
//该函数能输出head所指的链表的所有结点值,输出形式如下:
/本函数输出线性表sq中所有数据,形式如下:
学号 姓名 分数
12 张三 2345
18 李四 9877
……… ……… ……/
}
//3、写出在链表中删除结点的函数
int del_link(NODE head,char name[])
{
NODE p,p1;
p=head->next;
p1=head;
while(p!=NULL)
{
if(strcmp(p->stname,name)!=0)
{
p1=p;
p=p->next;
}
else
{
break;
}
}
if(p!=NULL)
{
p1->next=p->next;
free(p);
return 1;
}
else
{
return 0;
}
//删除head所指的链表中,名字为name的结点,删除成功返回1,不成功返回0
}
//4、写出在链表中插入结点的算法
int insert(NODE head,student x,int wz)
{
NODE p=head;
int i=0,jg;
if(wz<=0)
{
jg=0;
}
else
{
while(i<wz-1&&p!=NULL)
{
i++;
p=p->next;
}
if(p==NULL)
{
jg=0;
}
if(i=wz-1)
{
//找到wz前面的节点,p指向它
NODE q;
q=(NODE )malloc(sizeof(NODE));
q->stnum=xnum;
strcpy(q->stname,xname);
q->stscore=xscore;
q->next=p->next;
p->next=q;
jg=1;
}
}
return jg;
//该函数能够在wz这个结点之前,插入一个新结点,新结点的数据域为x。插入成功返回1,不成功返回0。
}
//5、写出主函数,分别调用上面算法所对应的程序,建立链表,并输出链表的值。
void main()
{
NODE head; //定义指针变量head
int wz; //表示插入位置
char xm[30];
student st; //定义一个变量st,用来表示一个学生的信息
head=creat_link(1);
print_link(head); //调用函数建立链表,并把返回值送给head;
//调用函数,输出链表中各个结点的值
//输入一个学生的有关信息,送给变量st的有关成员
printf("\n\n请输入要插入的位置:");
scanf("%d",&wz); //输入wz的值
printf("请输入要插入的学生的学号:");
scanf("%d",&stnum);
printf("请输入要插入的学生的姓名:");
scanf("%s",stname);
printf("请输入要插入的学生的成绩:");
scanf("%f",&stscore);
//调用函数,在链表中把学生st的值作为一个结点插入,如果插入成功,输出新链表
if(insert(head,st,wz)==1)
{
printf("\n插入成功,新表为:\n");
print_link(head);
}
else
{
printf("插入不成功");
}
//调用函数,在链表中删除一个指定结点的值,如果删除成功,输出新链表
printf("\n\n请输入要删除的学生的姓名:");
getchar();
gets(xm);
if(del_link(head,xm)==1)
{
printf("\n删除成功,新表为:\n");
print_link(head);
}
else
{
printf("删除不成功");
}
}
链表的创建:
#include “stdlibh”
#include “stdioh”
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student next;
};
int n;
struct student creat(void)
{
struct student head;
struct student p1,p2;
n=0;
p1=p2=(struct student )malloc(LEN);
scanf(“%ld,%f”,&p1->num,&p1->score);
head=NULL;
while(p1->num != 0)
{
n=n+1;
if(n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct student )malloc(LEN);
scanf(“%ld,%f”,&p1->num,&p1->score);
}
p2->next = NULL;
return(head);
}
void main()
{
creat();
}
这样便可创建链表
以上就是关于如何用C语言创建一个链表,实现增、删、改、查全部的内容,包括:如何用C语言创建一个链表,实现增、删、改、查、如何实现C语言链表、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)