❶ 如何用c语言创建一个链表,实现增、删、改、查
#include<stdio.h>
#include<string.h>
#include <malloc.h>
//先定义一种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->st.num=xh;
printf("请输入第%d个学生的姓名:",i);
scanf("%s",p->st.name);
printf("请输入第%d个学生的成绩:",i);
scanf("%f",&p->st.score);
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->st.num=xh;
printf("请输入第%d个学生的姓名:",i);
scanf("%s",p->st.name);
printf("请输入第%d个学生的成绩:",i);
scanf("%f",&p->st.score);
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%-10.1f\n",p->st.num,p->st.name,p->st.score);
p=p->next;
}
//该函数能输出head所指的链表的所有结点值,输出形式如下:
/*本函数输出线性表sq中所有数据,形式如下:
学号 姓名 分数
12 张三 234.5
18 李四 987.7
……… ……… …….*/
}
//3、写出在链表中删除结点的函数
int del_link(NODE *head,char name[])
{
NODE *p,*p1;
p=head->next;
p1=head;
while(p!=NULL)
{
if(strcmp(p->st.name,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->st.num=x.num;
strcpy(q->st.name,x.name);
q->st.score=x.score;
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",&st.num);
printf("请输入要插入的学生的姓名:");
scanf("%s",st.name);
printf("请输入要插入的学生的成绩:");
scanf("%f",&st.score);
//调用函数,在链表中把学生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("删除不成功");
}
}
❷ c语言链表的创建
这个链表做得不好。其实链表可以不用创建这一步。因为插入操作已经包含有创建功能了。else后面的语句,就如同你给绳子打结一样。链表的节点好比一段一段的绳子,现在你需要把它们都接起来。你每接一段,手就要往后移动一节,以准备给下一段打结。else后面的语句,其实就是让当前指针指向的节点后移。
我给你个程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct tagPERSON //个人信息结构
{
char name[20];
long age;
}PERSON;
//template<typename DT> //如果是C++的话,这里方便许多,可以使用模板和类
typedef struct tagLNODE* pLNODE;
typedef struct tagLNODE //链表节点
{
PERSON data;
pLNODE next;
}LNODE;
int link_insert(pLNODE *head,PERSON data)//链表插入
{
pLNODE cur_tmp,lnode_tmp;
cur_tmp=*head;
lnode_tmp=(pLNODE)malloc(sizeof(LNODE));
if(lnode_tmp==NULL)return -1;
lnode_tmp->data=data;
lnode_tmp->next=NULL;
if(*head==NULL)
*head=lnode_tmp; //如果head为空,则需要对main()中的head修改,所以head的类型为指向指针的指针
else
{
while(cur_tmp->next!=NULL)
cur_tmp=cur_tmp->next;
cur_tmp->next=lnode_tmp;
}
return 0;
}
int link_display_cmd(pLNODE head) //控制台下的链表显示
{
pLNODE cur_tmp;
cur_tmp=head;
while(cur_tmp!=NULL)
{
printf("%s:%d\n",(cur_tmp->data).name,(cur_tmp->data).age);
cur_tmp=cur_tmp->next;
}
return 0;
}
int link_clear(pLNODE *head) //清空链表
{
pLNODE cur_tmp,old_tmp;
cur_tmp=*head;
while(cur_tmp!=NULL)
{
old_tmp=cur_tmp;
cur_tmp=cur_tmp->next;
free(old_tmp);
}
*head=NULL;
return 0;
}
int main(void)
{
pLNODE head=NULL;
PERSON temp;
printf("Please input the name:");
scanf("%s",temp.name);
printf("Please input the age:");
scanf("%d",&(temp.age));
while(temp.age>0)
{
link_insert(&head,temp);
printf("Please input the name:");
scanf("%s",temp.name);
printf("Please input the age:");
scanf("%d",&(temp.age));
}
link_display_cmd(head);
link_clear(&head);
return 0;
}
❸ 用c语言建立一个有序链表
先按正常流程建立一个链表,再按照其某一个成员值进行冒泡排序(排序过程的交换,只交换链表指针以外的成员值)。
演示代码如下:(演示代码链表20个节点,成员值为随机值)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct slist
{
int a;
struct slist *next;
}SLIST;
SLIST *init();//生成20个节点成员为随机数的链表
void showList(SLIST *slHead);//打印链表
void px(SLIST *slHead,int flag);//float=1:降序。=2升序
int main()
{
SLIST *slHead=NULL;
slHead=init();
printf("排序前: ");
showList(slHead);
printf(" 降序排序后: ");
px(slHead,1);
showList(slHead);
printf(" 升序排序后: ");
px(slHead,2);
showList(slHead);
return 0;
}
void px(SLIST *slHead,int flag)//flag=1:降序。=2升序
{
SLIST *sl0=slHead->next,*sl1=NULL,slSave,*pSave=NULL;
while(sl0)
{
sl1=sl0->next;
while(sl1)
{
if((flag==1 && sl0->a<sl1->a)||(flag==2 && sl0->a>sl1->a))
{
slSave=*sl0;
*sl0=*sl1;
sl0->next=slSave.next;
pSave=sl1->next;
*sl1=slSave;
sl1->next=pSave;
}
sl1=sl1->next;
}
sl0=sl0->next;
}
}
void showList(SLIST *slHead)
{
int i=0;
while(slHead->next)
{
printf("节点%d成员值:%d ",++i,slHead->next->a);
slHead=slHead->next;
}
printf(" ");
}
SLIST *init()
{
int num,cnt=20;
static SLIST head;
SLIST *slHead=&head,*slTail=NULL,*slNew=NULL;
slHead->next=NULL;
srand(time(NULL));
while(cnt--)
{
num=rand()%100;
slNew=(SLIST *)malloc(sizeof(SLIST));
if(!slNew)return NULL;
slNew->a=num;
slNew->next=NULL;
if(!slHead->next)
slHead->next=slNew;
else
slTail->next=slNew;
slTail=slNew;
}
return slHead;
}
❹ 用c语言创建链表
void CreateList_H(Linklist L,int n)中的L是局部变量,你生成的头结点L不能被返回,应该改为:
Linklist CreateList_H(int n)
调用方式和函数内部返回值都需要相应改动。
❺ 创建链表的C语言程序
typedef
struct
tagLinkList{
int
val;
struct
tagLinkList
*next;
}LinkList,*pLinkList;
void
main()
{
LinkList
*l,*h;
l=(pLinkList)malloc(sizeof(LinkList));
scanf("%d",&l->val);
h=l;
l=(pLinkList)malloc(sizeof(LinkList));
scanf("%d",&l->val);
h->next=l;
printf("1=%d\n",h->val);
l=h->next;
printf("2=%d\n",l->val);
}闲的无聊,给你写个测试的,只是引导作用,可以参考
❻ 用C语言编程:创建一个链表 并在该链表的任意位置实现添加和删除的功能,要求在同一个程序中完成!
以前给别人做的一个链表,给你用功能富裕了你看看吧:
#include
"stdio.h"
struct
Node
{
Node
*pNext;
int
value;
}*pTop;
struct
Node*
Insert(struct
Node
*pNode,int
Num);
void
Del(struct
Node
*pDelNode);
struct
Node*
Search(struct
Node
*pNode,int
Num);
void
main()
{
pTop=NULL;
int
i,k,x,y;
struct
Node
*pCurrentNode,*pTempNode;
/*(1)建立带表头结点的单链表;*/
for(i=0;i<30;i++)
Insert(NULL,i);/*建立一个有30个结点的链表*/
/*(2)输出单链表中所有结点的数据域值;*/
pCurrentNode=pTop;
while(pCurrentNode!=NULL)
{
printf("%d->",pCurrentNode->value);/*遍历这个链表并输出其各结点的数据域*/
pCurrentNode=pCurrentNode->pNext;
}
/*(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;*/
printf("Input
x,y");
scanf("%d,%d",&x,&y);
pCurrentNode=Search(NULL,x);
Insert(pCurrentNode,y);
/*(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。
*/
printf("Input
k");
scanf("%d",&k);
pCurrentNode=pTop;
i=0;
while(1)
{
pTempNode=Search(pCurrentNode,x);
if(pTempNode!=NULL)
{
pCurrentNode=pTempNode->pNext;
Del(pTempNode);
i++;
}
else
break;
}
printf("%d
Nodes
was
deleted",i);
pTempNode=pTop;
while(pTop!=NULL)
{
pTop=pTempNode->pNext;
delete
pTempNode;
}
}
Node*
Insert(struct
Node
*pNode,int
Num)
{
struct
Node
*pNewNode;
pNewNode=new
Node;
pNewNode->value=Num;
if(pNode==NULL)/*无确定插入位置时将结点放在链表最后*/
{
if(pTop!=NULL)/*确定链表是否是空表*/
{
pNode=pTop;
while(pNode->pNext!=NULL)
pNode=pNode->pNext;/*找到尾结点*/
pNode->pNext=pNewNode;
}
else
{
pTop=pNewNode;
}
pNewNode->pNext=NULL;
}
else/*有确定插入位置时将结点放在指定结点之后*/
{
pNewNode->pNext=pNode->pNext;
pNode->pNext=pNewNode;
}
return
pNewNode;
}
void
Del(struct
Node
*pDelNode)
{
if(pDelNode==NULL
||
pTop==NULL)
return;/*防错处理*/
struct
Node
*pNode;
pNode=pTop;
while(pNode!=NULL
&&
pNode->pNext!=pDelNode)
pNode=pNode->pNext;/*找到指定结点的前导结点*/
if(pNode!=NULL)
{
pNode->pNext=pDelNode->pNext;
delete
pDelNode;
}
}
struct
Node*
Search(struct
Node
*pNode,int
Num)
{
struct
Node
*pSeaNode;
if(pNode==NULL)
pSeaNode=pTop;/*不指定搜索的起始位置,从表头开始*/
else
pSeaNode=pNode;/*指定了搜索的起始位置,从指定位置开始*/
while(pSeaNode!=NULL
&&
pSeaNode->value!=Num)
pSeaNode=pSeaNode->pNext;
return
pSeaNode;/*没有找到结点时返回空指针*/
}
❼ 用C语言编程(创建一个单向链表)
*creat a list*/
#include "stdlib.h"
#include "stdio.h"
struct list
{ int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
void main()
{ link ptr,head;
int num,i;
ptr=(link)malloc(sizeof(node));
ptr=head;
printf("please input 5 numbers==>\n");
for(i=0;i<=4;i++)
{
scanf("%d",&num);
ptr->data=num;
ptr->next=(link)malloc(sizeof(node));
if(i==4) ptr->next=NULL;
else ptr=ptr->next;
}
ptr=head;
while(ptr!=NULL)
{ printf("The value is ==>%d\n",ptr->data);
ptr=ptr->next;
}
}
上面是一个简单的创建链表的C程序。所谓链表形象的讲就是一个数据块里面存有数据,并且存有下一个数据的指针,这样一个指一个形成一个数据链。这个数据链可以被操作,例如插入数据,删除数据,等。至于指令,首先定义一个结构体,它存有数据和指向下一个数据块的指针。然后分配空间。注意最后一个为NULL,当然你也可以指向开头一个数据块形成一个循环链表
❽ C语言如何创建单链表
C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
intdata;
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);
}
❾ c语言创建链表
#include<stdio.h>
#include<stdlib.h>
struct chain
{
int value;
struct chain *next;
};
struct chain *create()
{
struct chain *head,*tail,*p;
int x;
head = tail = NULL;
while(scanf("%d",&x)==1)
{
p=(struct chain*)malloc(sizeof(struct chain));
p->value=x;
p->next=NULL;
if(head==NULL)
head = tail = p;
else
tail=tail->next=p;
}
return head;
}
struct chain *inlink(struct chain *head,int a,int b) //int a代表要插入的节点,int b代表创建节点的数据域
{
struct chain *p,*q,*s;
s = (struct chain *)malloc(sizeof(struct chain));
s->value=b;
if(head==NULL)
{
head = s;
head->next = NULL;
}
if(head->value == a)
{
s->next=head;
head = s;
}
else
{
p=head;
while((p->value!=a)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(p->value == a)
{
q->next = s;
s->next = p;
}
else
{
p->next=s;
s->next=NULL;
}
}
return (head);
}
struct chain *dellink(struct chain *head,int a) //int a代表要删除的节点
{
struct chain *q,*p;
if(head == NULL)
printf("找不到节点!\n");
else if(head->value == a)
{
p = head;
head = head->next;
}
else
{
p=head;
while((p->value!=a)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(p->value != a)
printf("链表不存在此节点!\n");
else
{
q->next = p->next;
free(p);
}
}
return (head);
}
void main()
{
struct chain *p,*q;
q=create(); //链表的创建;
//q=inlink(create(),3,1); //链表的插入;
//q=dellink(create(),2); //链表的删除;
while(q){ //输出链表;
printf("%d\n",q->value);
p=q->next;
free(q);
q=p;
}
}
求采纳为满意回答。