数据结构之链表(第二天)

定义

线性结构,不连续,由值域与指针域组成

具体组成

  1. 头指针:指向头结点的指针,可以说有了一个头指针就有了一个链表
  2. 头结点:没有有效值,有指向首结点的指针,用途我没有感觉到,但肯定很有用
  3. 首结点:有有效值的第一个结点
  4. 尾结点:只有有效值,没有指针
  5. 尾指针:指向为结点,最没有存在感

实例说明

和昨天的一样用一个例子来总结所有的用法,因为昨天说过,所以一些基础就不再赘述。见数据结构之数组

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>

//开始创建一个节点
typedef struct Node{
    int date;//数据域
    struct Node* pnext;//指针域 
}node,*pnode;

//声明函数功能
pnode create();//创建链接

void bianli(pnode phead);//遍历

bool is_empty(pnode phead);

void sort(pnode phead);//排序

void delete_link();//删除,我没有写下去,复习的时候独立写出

int len(pnode phead);//计算长度

bool insert(pnode phead, int pos, int val);//插入



int main(void){
    pnode phead = NULL;//先创建头指针,头指针是链表的唯一条件 
    phead = create();//返回一个头指针的地址就搞定了一个链表 
    bianli(phead); 
    if(is_empty(phead) ==false){
        printf("不为空\n");
    }
    printf("长度为 %d",len(phead));
    
    printf("-------------------------------\n");
    sort(phead);
    bianli(phead);
    return 0;
    
} 

pnode create(){
    int len;//用来记录有多少个节点
    int i;
    int val;//用来储存临时节点的值
    printf("输入您想要的节点个数,len = \n");
    pnode phead = (pnode)malloc(sizeof(node));//创建一个头指针
    if(NULL ==phead){//一般的内存地址分配失败结果就会为空
        printf("分配失败"); 
        exit(-1);
    }
    pnode ptail = phead;//创建的尾巴主要为了保证每个节点的末尾都是下一个节点的地址
    ptail->pnext = NULL;//对于下一个未知节点就先令其为空
    
    scanf("%d ",&len);
    for(i = 0;i<len;i++){
        printf("请输入第%d个节点的值\n",i+1);
        scanf("%d",&val);
        pnode pnew = (pnode)malloc(sizeof(node));
        if(NULL ==pnew){
        printf("分配失败");
        exit(-1);
        }
        pnew->date = val;//对于一个新的节点,先前半部分赋值
        ptail->pnext = pnew;//赋值上一个节点的后半部分地址
        pnew->pnext = NULL;//新的节点的后半部分先空着
        ptail = pnew;//尾巴右移
    }
    return phead;
}


void bianli(pnode phead){
    int i = 0;
    pnode p = phead->pnext;
    for(i;p !=NULL;i++){
        printf("第%d个值为%d\n",i+1,p->date);
        p = p->pnext;
    }
}

bool is_empty(pnode phead){
    if(phead->pnext ==NULL){
        return true;
            }
        else 
            return false;
}


int len(pnode phead)
{
    int i = 0;
    pnode p = phead->pnext;
    for(i;p !=NULL;i++){
        //printf("第%d个值为%d\n",i+1,p->date);
        p = p->pnext;
    }
    return i;
}

//整个排序的代码与正常的数组的一样,这好像可以理解为c的泛型
void sort(pnode phead){
    int i = 0, j,t;
    int le = len(phead);
    pnode p, q;
    for(i,p = phead->pnext;i<le-1;i++,p = p->pnext){//注意循环量不仅要++,而且要链接的跟进
        for(j = i+1,q = phead->pnext;j<le;j++,q = q->pnext){
        if(p->date > q->date){
            t = p->date;
            p->date = q->date;
            q->date = t;
        }
    }
    }
}


//其实下面的代码有点难度理解,建议配合郝斌老师的视频来理解,然后自己动笔画一画,我尽力讲解
bool insert(pnode phead, int pos, int val){
    int i = 0;
    pnode p = phead;//首先要定位要插入的位置
    while(p !=NULL&& i<pos-1){//这段代码把位置定位到pos的前一个节点的指针域
        p = p->pnext;
        i++;
    }
    if(NULL = p||i>pos - 1)//可无
        return false;
    pnode pnew = (pnode)malloc(sizeof(node));//创造要插入的节点
    if(pnew == NULL){
        printf("内存分配失败");
        exit(-1);
    }
    pnew->date = val;//以下四句就类似于交换a与b的值。只不过把a与b换成 p->pnext与pnew
    pnode q = p->pnext;
    p->pnext = pnew;
    pnew->pnext = q;
    
    return true;
    
} 

猜你喜欢

转载自www.cnblogs.com/xiaolongdejia/p/11165965.html