非循环单向链表-增删改查排-释放

来源:互联网 发布:gif图分解软件 编辑:程序博客网 时间:2024/05/21 04:19
#include "stdio.h"#include "stdlib.h"#include "malloc.h"typedef struct nodes//链表主体结构{int data;//链表DATA区域struct nodes *next;//链表指针区域}node,*pnode;pnode creat()//创建链表头节点和主体节点{int i=0,data;pnode phead=NULL,pnew,ptail;start:i++;printf("给第%d个节点赋值(输入0完成链表建立)请输入:",i);scanf("%d",&data);head:if(!data)//判断输入是否为0,为0完成链表建立{printf("链表建立完成!\n");return phead;}if(!(pnew=malloc(sizeof(node))))//分配链表节点内存空间{printf("分配内存错误!!!");exit(0);}if(!phead)//生成头节点{phead=ptail=pnew;goto head;}pnew->data=data;//给新节点赋值ptail->next=pnew;//把新节点挂载到尾节点pnew->next=NULL;//新节点指针置为空ptail=pnew;//把新节点记录为尾节点goto start;}int print(pnode phead)//读取链表,空返回0,不空返回链表长度{int sum=0;pnode p = phead->next;if(!p){return 0;}else{printf("链表的值为:");while(p)//判断是不是尾节点{printf("  %d",p->data);//输出节点值p=p->next;//把指针指向下一节点sum++;//计算长度}printf("\n");printf("链表的长度为:%d\n",sum);return sum;}}insert(pnode p,int find,int val)//加入一个节点,find为插入节点位置{int i;pnode ptail,pnew;for(i=0;p&&i<find-1;i++){p=p->next;}if(p){if(!(pnew=malloc(sizeof(node))))//创建一个新的动态节点{printf("分配内存错误!!!");exit(0);}pnew->data=val;ptail=p->next;p->next=pnew;pnew->next=ptail;}else{printf("输入插入节点溢出!!!");exit(0);}return;}remove(pnode p,int find)//弹出一个节点{int i;pnode q;for(i=0;p->next&&i<find-1;i++){p=p->next;}if(p->next){q=p->next;p->next=p->next->next;printf("删除节点的值为:%d\n",q->data);free(q);q=NULL;}elseprintf("删除失败!!!\n");}sort(pnode phead,int sum)//排序{int i,j;pnode p,q;for(i=0,p=phead->next;p->next;p=p->next,i++)for(j=i+1,q=p->next;j<sum;q=q->next,j++){if(p->data>q->data){q->data^=p->data;p->data^=q->data;q->data^=p->data;}}return;}del(pnode p){pnode temp;while(p){temp=p;p=p->next;free(temp);}return;}int main(void){pnode phead=NULL;//链表头节点指针int sum=0;//链表长度phead=creat();//创建链表//insert(phead,4,55);//在第四节点的位置插入值为55的节点//remove(phead,3);//删除第三节点//(sum=read(phead))?sort(phead,sum):printf("链表为空!无法排序\n");//对链表进行排序print(phead)?printf("完毕!!!\n"):printf("链表为空!!!\n");//读取链表值和长度//del(phead);//删除整个链表return 0;}

原创粉丝点击