码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构之线性链表

时间:2015-11-01 00:27:01      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:

#include<stdio.h>
#include<malloc.h>
/*
声明一个struct node的结构体类型,
包含数据域data和指向struct node变量的指针域,
利用typedef,将Node代替struct node,将PNode代替struct node*
*/
typedef struct node
{
int data;
struct node* next;
}Node,*PNode;

//对链表操作函数的声明
PNode create_list();
int length_list(PNode);
void sort_list(PNode);
bool insert_list(PNode,int,int);
bool delete_list(PNode,int,int*);
void traverse_list(PNode);

int main()
{
int len=0; //定义变量len,存放链表的长度
int val=0; //存放链表被删除位置的值
PNode PHead=NULL;
PHead=create_list(); //PHead指向链表的头结点
len=length_list(PHead);
printf("链表的长度:%d\n",len);

printf("原始链表:\n");
traverse_list(PHead); //遍历链表,依次输出

sort_list(PHead); //对链表进行排序
printf("排序后的链表:\n");
traverse_list(PHead);

if(insert_list(PHead,2,10)) //将44插入第二的位置
{
printf("插入元素后的链表:\n");
traverse_list(PHead);
}

if(delete_list(PHead,2,&val)) //删除位置为2的元素
{
printf("删除的值:%d\n",val); //输出删除元素的值
traverse_list(PHead);
}
return 0;
}

/*
创建指定大小的链表,并对其数据域赋值,
返回头结点的地址
*/
PNode create_list()
{
int len,val; //len为链表长度,val存放输入数据域的值
printf("请输入元素的个数:");
scanf("%d",&len);

PNode PHead=(PNode)malloc(sizeof(Node)); //申请一个大小为Node的动态空间,PHead指向该内存
PNode PTail=PHead; //PTail指向链表的最后一个元素,将头结点的地址赋值给PTail
PTail->next=NULL; //将头结点的指针域设置为空
PNode PNew=NULL;
for(int i=0;i<len;i++) //for循环添加链表元素
{
printf("请输入元素的值:");
scanf("%d",&val);
PNew=(PNode)malloc(sizeof(Node)); //申请一个大小为Node的动态空间,PNew指向该内存
PNew->data=val; //将val赋值给PNew的数据域
PTail->next=PNew; //将PNew赋值给PTail的指针域,添加到链表的最后
PNew->next=NULL; //将PNew的指针域设置为空
PTail=PNew; //再次PTail指向链表的最后一个元素
}
return PHead; //返回头结点的地址
}

/*
传入头结点的地址,利用while循环遍历输出链表

*/
void traverse_list(PNode PHead)
{
PNode p=PHead->next; //将头结点的指针域赋值给p
while(p!=NULL) //判断p是否为空,如果为空则跳出循环
{
printf("%d\t",p->data); //输出p的数据域
p=p->next; //p指向下一个指针域
}
printf("\n");
return;
}

/*
传入头结点的地址,利用while循环返回链表的长度

*/
int length_list(PNode PHead)
{
PNode p=PHead->next;
int len=0;
while(p!=NULL)
{
len++;
p=p->next;
}
return len; //返回链表长度len
}

/*
传入头结点的地址,插入位置pos和插入的值val,
先找到插入的pos位置的前一个元素的地址,然后将PNew的指针域赋值为pos-1的指针域,
将pos-1的指针域指向PNew

*/
bool insert_list(PNode PHead,int pos,int val)
{
int i=0;
PNode p=PHead;
while(i<pos-1&&p!=NULL) //利用while循环找pos的上一个元素
{
p=p->next; //p指向下一个元素
i++; //位置加加
}
if(i>pos-1||p==NULL) //插入的位置不合理,则返回false
{
printf("插入的位置不合理!\n");
return false;
}
PNode PNew=(PNode)malloc(sizeof(Node));
PNew->data=val;
PNew->next=p->next; //将p的指针域赋值给PNew的指针域
p->next=PNew; //将p的指针域指向PNew
return true;
}

/*
传入头结点的地址,插入位置pos和变量val的地址,
先找到pos-1位置的地址,然后将该元素的指针域指向的数据赋值给*val
将pos-1的指针域被赋值为下一个元素的指针域

*/
bool delete_list(PNode PHead,int pos,int* val)
{
int i=0;
PNode p=PHead;
while(i<pos-1&&p!=NULL) //找到pos位置的元素
{
p=p->next;
i++;
}
if(i>pos-1||p==NULL)
{
printf("删除的位置不合理!\n");
return false;
}
PNode q=p->next; //指针q指向的元素将被删除
*val=q->data; //将q指向的数据赋值给*val
p->next=p->next->next; //将删除元素的上一个元素的指针域赋值为删除元素的指针域
free(q); //释放q指向的内存
return true;
}

/*
传入头结点的地址,利用选择排序算法对链表进行排序

*/
void sort_list(PNode PHead)
{
PNode p,q; //定义结构指针p,q
int len=length_list(PHead); //获得链表的长度len
int i,j,temp;
for(i=0,p=PHead->next;i<len-1;i++,p=p->next) //初始变量p为首结点地址,增量p指向指针域
{
for(j=i+1,q=p->next;j<len;j++,q=q->next)
{
if(p->data>q->data) //进行升序排序
{
temp=p->data; //利用temp,将p->data与q->data的值交换
p->data=q->data;
q->data=temp;
}
}
}
}

技术分享

数据结构之线性链表

标签:

原文地址:http://www.cnblogs.com/swcks/p/4926547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!