c语言自动生成一个链表,用C语言创建一个链表数据结构

链表是一种数据结构,对于要学习数据结构的人学习好链表是非常重要的。

一个链表需要包含什么呢,我的理解就是:1、有n个节点离散分配,2、每个节点通过指针来连接,3、每个节点都有一个前驱节点和一个后驱节点,4、首节点没有前驱节点,尾节点没有后驱节点。

一、节点的构造

typedef struct Nod

{

int data;//存放数据的域

struct Node *pNext; //定义一个结构体指针,指向下一个数据类型相同的节点

}NODE,*PNODE; //NODE等价于 struct Node; PNODE等价于struct Node *; 此处用大写是为了与变量区分,可以让人容易变出是个数据类型

typedef 只是给数据类型取个别名,即 typedef 数据类型 别名;我们知道struct Node 是我们定义的数据类型;

(2)链表的创建

在创建链表之前,我们需要需要了解一下专业术语:

首节点:存放第一个有效数据的节点;

尾节点:存放最后一个有效数据的节点;

头节点:头节点的数据类型与首节点的数据类型相同,并且头节点是首节点前面的那个节点,并不存放有效数据;头节点的存在只是为了方便链表的操作。

头指针:指向头节点的指针;

尾指针:指向尾节点的指针;

二、在头节点后面插入一个节点

PNODE Create_Lise(void){

int len;//存放链表的长度

int i;//循环变量

int val;//用来临时存放变量

PNODE Lise;

PNODE pHead=(PNODE) malloc(sizeof(NODE));//分配一个节点

if(pHead==NULL){

printf("请输入链表的值");

exit(-1);

}else{

PNODE pTail=pHead;

pHead->pNext=null;

printf("需要一个指针指向结尾");

scanf("%d",&len);

for(i=o;i

PNODE p=(PNODE)malloc(sizeof(NODE));

if(null=p){

printf("插入了");

exit(-1);

} else{

printf("我在最后插入");

scanf("%d",&val);

p->data=val;

pTail->pNext=p;

p->pNext=null;

pTail=p;

}

}

}

}

三、向链表插入元素

//链表的第pos有效元素前面插入元素val,首先我们应该找到第pos个元素前面一个元素的位置;

//当链表有3个元素时,pos=4,将不会进行插入操作

bool Insert_List(PNODE pHead,int pos,int val){

int i=0;

PNODE p=pHead;

while((Null!=p)&&(i

p=p->pNext;

i++

}

if(p==null||i>pos-1)//把链表为空的情况考虑进去了;i>pos-1可以防止用户输入错误;

return false;

//程序执行到这之后,i=pos-1;p指针指向链表第pos个有效节点前驱,即指向第pos-1节点;

PNODE q=(PNODE)malloc(sizeof(NODE));

q->data=val;

q->pNext=p->pNext;

p->pNext=q;

}

四、删除链表中的元素

bool Delete_Lise(PNODE pHead,int pos,int *var){

int i=0;

PNODE p=pHead;

while((NULL!=p)&&(i

p=p->pNext;

i++;

}

if(p==null||i>pos-1) //把链表表为空的情况去了

return false;

//程序执行到这后,i=pos-1;

PNODE q=p->pNext;//q指向待删除的节点

*val=q->data;

p->pNext=q->pNext;//修改链表的指向

free(q); //释放q所指向节点的内存

q=NULL; //如果不清空,会出现野指针

}

五来来来冒泡排序一下

void Sort_List(PNODE pHead){

int i,j;

int temp;

int len=length_List(pHead);

PNODE p,q;

for(i=0,p-pHeda->pNext;ipNext){

for(j=i+1,q=p->pNext;ipNext){

//交换数据

if(p->data>q->data){

temp=p->data;

p->data=q->data;

q->data=temp;

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值