c语言链表基本操作

来源:互联网 发布:芮纳纪 淘宝 编辑:程序博客网 时间:2024/05/20 09:21

对于c语言链表的增删改查

#include <stdio.h>#include <stdlib.h>#include<malloc.h>#define true 1#define false 0typedef int bool;typedef struct Node{    int val;    struct Node * next;}NODE,*PNODE;//函数声明void traverse_list(PNODE pHead);PNODE create_list(void);bool is_empty(PNODE);int length_list(PNODE);bool insert_list(PNODE,int,int);bool delete_list(PNODE,int,int*);void sort_list(PNODE);//对链表元素进行排序void sort_list(PNODE pHead){    int len = length_list(pHead);    if(len<=1)    {        printf("链表元素太少,无法执行排序操作");        return;    }    int i,j,temp;    PNODE p ;                    //现在 p 指向的是首节点    for(i=0;i<len;i++)    {        p = pHead->next;          // 每一次循环执行时,需要从当前首节点向后执行        for(j=0;j<len-i-1;j++)        {            if(p->val < p->next->val)            {                temp = p->val;                p->val = p->next->val;                p->next->val = temp;            }            p = p->next;        }    }}//删除某个元素bool delete_list(PNODE pHead ,int pos,int* val){        //以下的条件判断方法很巧妙        int i = 0;        PNODE p = pHead;        while(NULL!=p->next&&i<pos-1)        {            p= p->next;            i++;        }        if(i>pos-1 || NULL == p->next)        {            return false;        }        PNODE r = p->next;  // 用 r 记住后,用来释放内存,防止内存泄露        *val = p->next->val;        p->next = p->next->next;        free(r);        r = NULL;        return true;}//插入某个元素bool insert_list(PNODE pHead,int pos,int value){        int i = 0;    PNODE p = pHead;    while(NULL!=p->next&&i<pos-1)    {        p= p->next;        i++;    }    if(i>pos-1 || NULL ==p->next)    {        return false;    }    //程序执行到这个地方时,说明已经找到了要插入的位置     PNODE q = (PNODE)malloc(sizeof(NODE));     if(NULL == q)     {         printf("内存分配失败,程序将退出");         exit(-1);     }     q->val = value;     q->next = p->next;     p->next = q;     return true;}//求链表的长度int length_list(PNODE pHead){    int len=0;    PNODE p = pHead;    while(NULL != p->next)    {        len++;        p = p->next;    }    return len;}bool is_empty(PNODE pHead){    if(NULL == pHead->next)    {        return true;    }    else    {        return false;    }}//构造链表PNODE create_list(void){    int len,i,value;    printf("请输入您要创建的链表中的元素个数 len = ");    scanf("%d",&len);        PNODE pHead = (PNODE)malloc(sizeof(NODE));   //   最后需要返回的头指针    pHead->next=NULL;    PNODE pTail = pHead;                         // 最开始的时候尾指针指向头指针,因为元素个数为零。    for(i=0;i<len;i++)    {        PNODE pNew = (PNODE)malloc(sizeof(NODE));   //分配一个新节点        printf("请输入第%d个元素中的value值 value = ",i+1);        scanf("%d",&value);        pNew->val = value;       //构造新节点的值        pNew->next = NULL;    // 构造新节点的指针域        pTail->next = pNew;     // 将新节点挂到尾节点上        pTail = pNew;              //更新尾节点,新挂上的节点为尾节点    }    return pHead;}//遍历整个链表,并输出void traverse_list(PNODE pHead){    PNODE p = pHead->next;    while(NULL != p)    {        printf("%d ",p->val);        p = p->next;    }    printf("\n");}//主函数int main(){    PNODE pHead = create_list();    traverse_list(pHead);    if(is_empty(pHead))    {        printf("empty\n");    }    else    {        printf("not empty\n");    }    printf("------------------------------------------\n");    int len = length_list(pHead);    printf("链表的长度为 %d \n",len);    printf("------------------------------------------\n");    int val,pos;    printf("请输入您要插入的位置 pos = ");    scanf("%d",&pos);    printf("请输入您要插入的数据 val = ");    scanf("%d",&val);    insert_list(pHead,pos,val);    printf("------------------------------------------\n");    printf("插入数据后的链表为\n");    traverse_list(pHead);    printf("------------------------------------------\n");    printf("请输入您要删除的元素的位置为:");    scanf("%d",&pos);    while(!delete_list(pHead,pos,&val))    {        printf("删除失败,请重新输入要删除元素的位置");        scanf("%d",&pos);    }    printf("删除后的链表遍历为:\n");    traverse_list(pHead);    printf("您删除的位置所在处的元素为:%d  \n",val);    printf("------------------------------------------\n");    sort_list(pHead);    printf("排序后的链表输出为:\n");    traverse_list(pHead);    return 0;}


1 1
原创粉丝点击