数据结构与算法(3)--链表

来源:互联网 发布:软件授权使用协议书 编辑:程序博客网 时间:2024/06/07 11:56

1.链表的基础知识

首节点:
            第一个有效节点
尾节点:
            最后一个有效节点
头节点:
            头节点的数据类型和首节点类型一样
            是第一个有效节点之前的那个节点
    头节点并不存放有效数据
    加头节点的目的主要是为了方便对链表的操作

头指针:
  指向头节点的指针变量
  尾指针:
  指向尾节点的指针变量
  如果希望通过一个函数来对链表进行处理,我们只需要一个参数:头指针

泛型:不同的存储方式,执行的操作是一样的


2.链表的增删改查

#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct Node{int data;     //数据域struct Node * pNext;    //指针域}NODE , * PNODE;//NODE 等价于struct Node  PNODE等价于struct Node *PNODE create_list(void);void traverse_list(PNODE pHead);bool is_empty(PNODE pHead);int length_list(PNODE);//可以省略参数名bool insert_list(PNODE,int ,int );//插入,参数:那个链表,插入位置,插入的值bool delete_list(PNODE,int ,int *);void sort_list(PNODE);int main(){int length;int val;PNODE create_list(void);PNODE pHead=NULL; //等价于 struct Node * pHead =NULLpHead=create_list();//create_list()功能:创建一个非循环单链表,并将该链表的头节点的地址赋给pHeadtraverse_list(pHead); //遍历is_empty(pHead);    length=length_list(pHead);printf("链表长度=%d\n",length);printf("排序:");sort_list(pHead);traverse_list(pHead);insert_list(pHead,3,99 );traverse_list(pHead);if(delete_list(pHead,5,&val)==true){printf("删除成功   删除的数:%d ",val);}else{    printf(" 删除失败");}printf("\n");traverse_list(pHead);    return 0;}PNODE create_list(void)  //返回一个地址{int len;int i;int val; //用来临时存放用户输入的节点的    PNODE pHead=(PNODE)malloc(sizeof(NODE));//分配了一个不存放有效数据的头节点if(NULL==pHead){printf("分配失败,程序终止\n");exit(-1);}PNODE pTail=pHead; //定义一个pTail,使他永远指向为节点pTail->pNext=NULL;        //这里只有一个头节点,相当于pTail也指向了尾节点printf("请输入您需要生产的链表节点的个数:len=");scanf("%d",&len);for(i=0;i<len;++i){printf("请输入第%d个节点的值:",i+1);scanf("%d",&val);PNODE pNew=(PNODE)malloc(sizeof(NODE));  if(NULL==pHead){printf("分配失败,程序终止\n");exit(-1);}pNew ->data =val;   //每循环一次,生成一个新的节点,每次都把新的节点挂到pTail后面pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew;}           return pHead;}void traverse_list(PNODE pHead){PNODE p=pHead->pNext;while(NULL!=p)      //当p指向尾节点时,p为空{   printf("%d   ",p->data);   p=p->pNext;}    printf("\n");}bool is_empty(PNODE pHead){if(pHead->pNext==NULL){printf("链表为空");return true;}else{    return false;}}int length_list(PNODE pHead){int len=0;while(pHead->pNext!=NULL){len++;pHead=pHead->pNext;}    return len;}void sort_list(PNODE pHead){int i,j,t;PNODE p,q;for(i=0,p=pHead->pNext;i<length_list( pHead)-1;++i,p=p->pNext){   for(j=i+1,q=p->pNext;j<length_list(pHead);++j,q=q->pNext)   {if(p->data > q->data){        t=p->data;p->data=q->data;q->data=t;}}}return ;}bool insert_list(PNODE pHead,int pos ,int val ){int i=0;PNODE p=pHead;while(p!=NULL && i<pos-1){p=p->pNext;i++;}if(i>pos || p==NULL){    return false;}PNODE pNew=(PNODE) malloc(sizeof(NODE));pNew->data=val;PNODE q=p->pNext;  //上面程序已对链表进行循环,将p定位到插入位置p->pNext=pNew;pNew->pNext=q;return true;}bool delete_list(PNODE pHead,int pos,int * val)     //利用指针在函数中更改全局变量val的值{int i=0;PNODE p=pHead;while(p!=NULL && i<pos-1){p=p->pNext;i++;}if(i>pos || p==NULL){    return false;}*val=p->pNext->data;   //将删除的数据存入指针val所指向的地址中p->pNext=p->pNext->pNext; //删除节点p->pNextreturn true;}


0 0
原创粉丝点击