链表的增删改查,逆置,长度,排序,是否为空
1.``准备阶段## ##
# include<stdio.h>
# include<stdlib.h>
typedef struct Node
{
int data;
struct Node* pNext;
}NODE,*PNODE;
PNODE creat_list(void);
void traverse_list(PNODE);
void insert_list(PNODE,int);
void delet_list(PNODE,int);
void change_list(PNODE,int);
void chear_list(PNODE);
void free_list(PNODE);
void inversion_list(PNODE);
void head_insert(PNODE);
void tail_insert(PNODE);
int length_list(PNODE);
void sort_list(PNODE);
bool is_empty(PNODE);
int main(void)
{
PNODE pHead = creat_list();
traverse_list(pHead);
is_empty(pHead);
// insert_list(pHead,3);
// traverse_list(pHead);
// delet_list(pHead,1);
// change_list(pHead,4);
// chear_list(pHead);
free_list(pHead);
is_empty(pHead);
// insert_list(pHead,0);
// insert_list(pHead,0);
// head_insert(pHead);
// inversion_list(pHead);
// tail_insert(pHead);
// length_list(pHead);
// sort_list(pHead);
traverse_list(pHead);
return 0;
}
2.创建函数
PNODE creat_list(void)
{
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(!pHead)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
PNODE pTail = pHead;
pTail->pNext = NULL;
int len, val, i;
puts("链表长度为:");
scanf("%d",&len);
for(i=0;i<len;++i)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
printf("第%d个链节的数据为:",i+1);
scanf("%d",&val);
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
3.增----头插,尾插,任意位置插入:
头插代码:
void head_insert(PNODE pHead)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
pHead->pNext = pNew;
puts("请输入你要头插的数:");
scanf("%d",&pNew->data );
pNew->pNext = NULL;
}
尾插代码:
void tail_insert(PNODE pHead)
{
PNODE p = pHead->pNext;
while(p->pNext)
{
p = p->pNext ;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
puts("请输入想尾插的数为:");
scanf("%d",&pNew->data ) ;
p->pNext = pNew;
pNew->pNext = NULL;
}
}
任意位置插入:
void insert_list(PNODE pHead,int pos)
{
PNODE p = pHead->pNext ;
int i;
while(i<pos-1&&p)
{
++i;
p = p->pNext ;
}
if(p)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
printf("在第%d个数后插入:",pos);
scanf("%d",&pNew->data );
pNew->pNext = p->pNext ;
p->pNext = pNew;
}
else
{
puts("没有该位置!");
}
}
2.删除函数----任意节点删除,链表清空
任意节点删除:
void delet_list(PNODE pHead,int pos)
{
PNODE p = pHead->pNext ,q;
int i = 0;
while(i<pos-1&&p)
{
++i;
q = p;
p = p->pNext ;
}
if(p)
{
q->pNext = p->pNext ;
free(p);
}
else
puts("没有该节点!");
}
链表清空:
void free_list(PNODE pHead)
{
PNODE p = pHead->pNext ;
PNODE q ;
while(p)
{
q = p->pNext ;
free(p);
p = q;
}
pHead->pNext = NULL;
printf("链表已清空!");
}
注:链表清空后,想要继续插入必须使用头插!
3.任意节点改动:
void change_list(PNODE pHead,int pos)
{
PNODE p = (PNODE)malloc(sizeof(NODE));
p =pHead->pNext;
int i = 0;
while(i<pos-1&&p)
{
++i;
p = p->pNext ;
}
if(p){
printf("将第%d个链节的值改为:",pos);
scanf("%d",&p->data );
}
else
puts("没有该节点!");
}
4.任意数据查找:
void chear_list(PNODE pHead)
{
int val,i=1,judge = 1;
puts("想查几:");
scanf("%d",&val);
PNODE p = pHead->pNext ;
while(p)
{
if(val == p->data )
{
printf("%d在第%d个链节中!",val,i);
judge = 0;
}
i++;
p = p->pNext;
}
if(judge)
puts("没有该值!");
}
5.链表的逆置:
void inversion_list(PNODE pHead)
{
PNODE p = pHead->pNext,q ;
pHead->pNext = NULL;
while(p)
{
q = p;
p = p->pNext ;
q->pNext = pHead->pNext ;
pHead->pNext = q;
}
puts("链表已逆置!");
}
6,判读链表长度
int length_list(PNODE pHead)
{
int len = 0;
PNODE p = pHead->pNext ;
while(p)
{
p = p->pNext ;
++len;
}
printf("链表长度为%d\n",len);
return len;
}
7,链表数据排序
void sort_list(PNODE pHead)
{
int t,i,j,len = length_list(pHead);
PNODE p,q;
for(i=0,p=pHead->pNext ;i<len-1;++i,p=p->pNext )
{
for(j=i+1,q=p->pNext ;j<len;++j,q=q->pNext )
{
if(p->data >q->data )
{
t = p->data ;
p->data = q->data ;
q->data = t;
}
}
}
}
8,判断链表是否为空:
bool is_empty(PNODE pHead)
{
if(pHead->pNext == NULL)
{
puts("链表为空!");
return true;
}
else
{
puts("链表不为空!");
return false;
}
}
9,完整代码
# include<stdio.h>
# include<stdlib.h>
typedef struct Node
{
int data;
struct Node * pNext;
}NODE,*PNODE;
PNODE creat_list(void);
void traverse_list(PNODE);
void insert_list(PNODE,int);
void delet_list(PNODE,int);
void change_list(PNODE,int);
void chear_list(PNODE);
void free_list(PNODE);
void inversion_list(PNODE);
void head_insert(PNODE);
void tail_insert(PNODE);
int length_list(PNODE);
void sort_list(PNODE);
bool is_empty(PNODE);
int main(void)
{
PNODE pHead = creat_list();
traverse_list(pHead);
is_empty(pHead);
// insert_list(pHead,3);
// traverse_list(pHead);
// delet_list(pHead,1);
// change_list(pHead,4);
// chear_list(pHead);
// free_list(pHead);
// is_empty(pHead);
// insert_list(pHead,0);
// insert_list(pHead,0);
// head_insert(pHead);
// inversion_list(pHead);
// tail_insert(pHead);
// length_list(pHead);
// sort_list(pHead);
// traverse_list(pHead);
return 0;
}
PNODE creat_list(void)
{
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(!pHead)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
PNODE pTail = pHead;
pTail->pNext = NULL;
int len, val, i;
puts("链表长度为:");
scanf("%d",&len);
for(i=0;i<len;++i)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
printf("第%d个链节的数据为:",i+1);
scanf("%d",&val);
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext ;
while(p)
{
printf(" %d " ,p->data );
p = p->pNext ;
}
puts("遍历结束!");
}
void insert_list(PNODE pHead,int pos)
{
PNODE p = pHead->pNext ;
int i;
while(i<pos-1&&p)
{
++i;
p = p->pNext ;
}
if(p)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
printf("在第%d个数后插入:",pos);
scanf("%d",&pNew->data );
pNew->pNext = p->pNext ;
p->pNext = pNew;
}
else
{
puts("没有该位置!");
}
}
void delet_list(PNODE pHead,int pos)
{
PNODE p = pHead->pNext ,q;
int i = 0;
while(i<pos-1&&p)
{
++i;
q = p;
p = p->pNext ;
}
if(p)
{
q->pNext = p->pNext ;
free(p);
}
else
puts("没有该节点!");
}
void change_list(PNODE pHead,int pos)
{
PNODE p = (PNODE)malloc(sizeof(NODE));
p =pHead->pNext;
int i = 0;
while(i<pos-1&&p)
{
++i;
p = p->pNext ;
}
if(p){
printf("将第%d个链节的值改为:",pos);
scanf("%d",&p->data );
}
else
puts("没有该节点!");
}
void chear_list(PNODE pHead)
{
int val,i=1,judge = 1;
puts("想查几:");
scanf("%d",&val);
PNODE p = pHead->pNext ;
while(p)
{
if(val == p->data )
{
printf("%d在第%d个链节中!",val,i);
judge = 0;
}
i++;
p = p->pNext;
}
if(judge)
puts("没有该值!");
}
void free_list(PNODE pHead)
{
PNODE p = pHead->pNext ;
PNODE q ;
while(p)
{
q = p->pNext ;
free(p);
p = q;
}
pHead->pNext = NULL;
printf("链表已清空!");
}
void inversion_list(PNODE pHead)
{
PNODE p = pHead->pNext,q ;
pHead->pNext = NULL;
while(p)
{
q = p;
p = p->pNext ;
q->pNext = pHead->pNext ;
pHead->pNext = q;
}
puts("链表已逆置!");
}
void head_insert(PNODE pHead)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
pHead->pNext = pNew;
puts("请输入你要头插的数:");
scanf("%d",&pNew->data );
pNew->pNext = NULL;
}
void tail_insert(PNODE pHead)
{
PNODE p = pHead->pNext;
while(p->pNext)
{
p = p->pNext ;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
puts("内存分配失败,程序退出!");
exit(-1);
}
puts("请输入想尾插的数为:");
scanf("%d",&pNew->data ) ;
p->pNext = pNew;
pNew->pNext = NULL;
}
int length_list(PNODE pHead)
{
int len = 0;
PNODE p = pHead->pNext ;
while(p)
{
p = p->pNext ;
++len;
}
printf("链表长度为%d\n",len);
return len;
}
void sort_list(PNODE pHead)
{
int t,i,j,len = length_list(pHead);
PNODE p,q;
for(i=0,p=pHead->pNext ;i<len-1;++i,p=p->pNext )
{
for(j=i+1,q=p->pNext ;j<len;++j,q=q->pNext )
{
if(p->data >q->data )
{
t = p->data ;
p->data = q->data ;
q->data = t;
}
}
}
}
bool is_empty(PNODE pHead)
{
if(pHead->pNext == NULL)
{
puts("链表为空!");
return true;
}
else
{
puts("链表不为空!");
return false;
}
}