对链表各种操作的实现(C语言)

来源:互联网 发布:python 字典转列表 编辑:程序博客网 时间:2024/05/18 01:46

对链表各种操作的实现(C语言)




#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef struct Node{   int data;//数据域    struct Node * pNext;//指针域 }NODE,*PNODE;//NODE等价于 struct Node//PNODE等价于NODEstruct Node* PNODE create_list();//初始化链表 void traverse_list(PNODE pHead);//遍历链表 bool is_empty(PNODE pHead);//判断链表是否为空int length_list(PNODE pHead);//获得链表长度 bool insert_list(PNODE,int,int);//在链表中插入一个数 bool delete_list(PNODE,int,int *); //在链表中删除一个数 void sort_list(PNODE);//对链表排序 int main(){int val=0;PNODE pHead=NULL;pHead=create_list();//创建一个非循环单链表,并将该链表的头结点的地址赋给pHead if(!is_empty(pHead)){printf("链表不为空!\n");}else{printf("链表为空!\n");}printf("链表的长度为:%d\n",length_list(pHead));traverse_list(pHead);sort_list(pHead);traverse_list(pHead);insert_list(pHead,3,22);traverse_list(pHead);if(delete_list(pHead,2,&val)){printf("删除成功!\n");printf("被删除的节点的数据是:%d\n",val);}else{printf("删除失败!\n");}traverse_list(pHead);   return 0;} PNODE create_list(){int len;int i;int val;// 用来临时存放用户输入的结点的值 printf("请输入您要生成的链表节点的个数:len=");scanf("%d",&len); PNODE pHead=(PNODE)malloc(sizeof(NODE));if(NULL==pHead){printf("分配失败!\n");exit(-1); } PNODE pTail=pHead;     pTail->pNext=NULL;for(i=0;i<len;i++){printf("请输入第%d个节点的值:",i+1);    scanf("%d",&val);     PNODE pNew=(PNODE)malloc(sizeof(NODE));    if(NULL==pNew)   {printf("分配失败!\n");exit(-1);   }    pNew->data=val;   pTail->pNext=pNew;   pNew->pNext=NULL;   pTail=pNew;    }return pHead;}void traverse_list(PNODE pHead){PNODE p=pHead->pNext;while(NULL!=p){printf("%d ",p->data);p=p->pNext;}printf("\n");return;}bool is_empty(PNODE pHead){PNODE p=pHead->pNext;if(NULL==p){return true;}else{return false;}}int length_list(PNODE pHead){int len=0;PNODE p=pHead->pNext;while(NULL!=p){len++;p=p->pNext;}return len;}//在pHead所指向链表的第pos个节点的前面插入一个新的节点,该节点的值是val,并且pos的值是从1开始 bool insert_list(PNODE pHead,int pos,int val){int i=0;PNODE p=pHead;while(NULL!=p&&i<pos-1){p=p->pNext;i++;}//跳出while循环时,i=pos-1,p指向pos-1这个节点 if(i>pos-1||NULL==p){return false;}PNODE pNew=(PNODE)malloc(sizeof(NODE));if(NULL==pNew){printf("动态分配内存失败!\n");exit(-1);}else{pNew->data=val;PNODE q=p->pNext;p->pNext=pNew;pNew->pNext=q;return true;}}bool delete_list(PNODE pHead,int pos,int *pVal){int i=0;PNODE p=pHead;while(NULL!=p->pNext&&i<pos-1){p=p->pNext;i++;} //跳出while循环时,i=pos-1//p指向pos-1 这个节点 //p->pNext第pos个节点,即待删除的节点 if(i>pos-1||NULL==p->pNext){return false;}    PNODE q=p->pNext;    *pVal=q->data;     p->pNext=p->pNext->pNext;       free(q);    q=NULL;return true;}void sort_list(PNODE pHead){PNODE p=pHead->pNext;PNODE q;int t=0;for(;NULL!=p;p=p->pNext){       for(q=p->pNext;NULL!=q;q=q->pNext)   {      if(p->data > q->data)      {        t=p->data;        p->data=q->data;        q->data=t;   }}}}


0 0
原创粉丝点击