线性表之单链表实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表之单链表实现相关的知识,希望对你有一定的参考价值。
for(循环)还是while(循环)循环之后,i和条件值相等。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE,*PNODE;
PNODE createList(PNODE );
void travelList(PNODE);
void insertList(PNODE,int,int );
void delList(PNODE,int,int *);
bool isEmpty(PNODE);
int listLength(PNODE);
void sortList(PNODE);
void main()
{
PNODE phead=(PNODE)malloc(sizeof(NODE));
phead->next=NULL;
//创建单链表
phead=createList(phead);
//遍历单链表
travelList(phead);
//插入结点至单链表中
printf("开始插入结点,请输入要插入的数据");
int val;
scanf("%d",&val);
insertList(phead,3,val);
//遍历单链表
travelList(phead);
//排序单链表
printf("开始排序\n");
sortList(phead);
//遍历单链表
travelList(phead);
//从单链表中删除结点
printf("开始删除结点");
int val1;
delList(phead,2,&val1);
travelList(phead);
/* //遍历单链表
travelList(phead);
//对单链表中元素进行排序
遍历单链表
travelList(phead);*/
}
PNODE createList(PNODE phead)
{
//创建单链表方法有2种,一种头插法,一种是尾插法。不管什么方法都需要创造新的节点都要挂到头结点上。
//你要造出一个结点,就得给结点赋值,创造一个赋值,2个赋值,多了,肯定要循环。你直接指定节点个数不就好了吗
/* 尾插法思想
PNODE ptail=phead;
printf("请输入当前结点个数\n");
int len;
scanf("%d",&len);
for(int i=0;i<len;i++)
{
PNODE pnew=(PNODE)malloc(sizeof(NODE)*len);
if(NULL==pnew)
{
printf("内存分配失败");
exit(-1);
}
else
{
printf("请给当前第%d个结点赋值",i+1);
int temp;
scanf("%d",&temp);
pnew->data=temp;
pnew->next=NULL;
}
phead->next=pnew;
phead=pnew;
}
return ptail;*/
//头插法思想
printf("请输入当前结点个数\n");
int len;
scanf("%d",&len);
for(int i=0;i<len;i++)
{
PNODE pnew=(PNODE)malloc(sizeof(NODE)*len);
if(NULL==pnew)
{
printf("内存分配失败");
exit(-1);
}
else
{
printf("请给当前第%d个结点赋值",i+1);
int temp;
scanf("%d",&temp);
pnew->data=temp;
pnew->next=NULL;
pnew->next=phead->next;
phead->next=pnew;
}
}
return phead;
}
void travelList(PNODE phead)
{
PNODE p=phead->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void insertList(PNODE phead,int pos,int val)
{
//最初的算法,可以实现,但是效率不高!
/* if(pos<1||pos>listLength(phead)+1)
{
printf("插入不合法,请重新插入");
return ;
}
PNODE pnew=(PNODE)malloc(sizeof(NODE));
pnew->data=val;
pnew->next=NULL;
//想插入结点,先找到其前面的一个结点。其实插入结点的时候,就是要将已经建立好的链表给弄断了,弄断了之后能不能接上问题。
// 只有找到前面的结点,能够接上,如果你找后面,接不上,或者效率很低。
int i=0;
PNODE ptemp=phead;
while(i<pos-1)
{
ptemp=ptemp->next;
i++;
}
pnew->next=ptemp->next;
ptemp->next=pnew;*/
// 高效率算法来了,不用来计算链表长度.
//按位置找,按位置插入,就不用判断链表的长度了。这种算法效率高些!
PNODE pnew=phead;
if(pos<1||pnew==NULL)
{
printf("无法插入");
return;
}
for(int i=0;i<pos-1;i++)
{
pnew=pnew->next;
}
PNODE ptemp=(PNODE)malloc(sizeof(NODE));
ptemp->next=NULL;
ptemp->data=val;
ptemp->next=pnew->next;
pnew->next=ptemp;
}
int listLength(PNODE phead)
{
int i=0;
PNODE pnew=phead->next;
while(pnew!=NULL)
{
i++;
pnew=pnew->next;
}
return i;
}
bool isEmpty(PNODE phead)
{
if(phead->next==NULL)
return true;
else
return false;
}
void sortList(PNODE phead)
{
int temp;
int i,j;
PNODE pnew;
for(i=0;i<listLength(phead)-1;i++)
for(j=0,pnew=phead->next;j<listLength(phead)-1-i;j++,pnew=pnew->next)
{
if(pnew->data>pnew->next->data)
{
//交换数据。
temp=pnew->next->data;
pnew->next->data=pnew->data;
pnew->data=temp;
}
}
}
void delList(PNODE phead,int pos,int *val)
{
int i=0;
PNODE pnew=phead;
if(pos<1&&pnew==NULL)//这个地方都不用判断为空,效率高吧!
{
printf("对不起,无法删除");
return;
}
for(i=0;i<pos-1&&pnew!=NULL;i++)
{
pnew=pnew->next;
}
PNODE q=pnew->next;
*val=pnew->next->data;
pnew->next=pnew->next->next;
printf("%d\n",*val);
free(q);
}
本文出自 “简答生活” 博客,转载请与作者联系!
以上是关于线性表之单链表实现的主要内容,如果未能解决你的问题,请参考以下文章