4线性表单链表不带头结点

    科技2023-10-28  109

    4线性表单链表不带头结点

    数据结构持续总结ing

    //初始化、判空、按位序插入 //不带头结点操作中,除了初始化,头插,尾插,删除操作与带头结点的单链表有差别外,其它的操作基本上一样。 #include <stdio.h> #include <stdlib.h>//malloc,free函数库 typedef int ElemType;//int另命名 typedef struct LNode{//定义单链表结点类型 ElemType data;//每个结点存放一个数据元素 struct LNode *next;//next指针,指向下一个节点 }LNode,*LinkList; //此处应注意:强调一个单链表使用LinkList、强调一个结点使用LNode * //注意此时申请结点指针代码:LNode *p=(LNode *)malloc(sizeof(LNode)); //注意此时申请头结点指针代码:L=(LNode *)malloc(sizeof(LNode)); (L已声明) bool InitList(LinkList &L){//初始化一个空的单链表 L=NULL; return true; } bool Empty(LinkList L){//判断单链表是否为空 if(L==NULL) return true; else return false; } bool ListInsert(LinkList &L,int i,ElemType e){//按位序插入,在第i个位置插入e if(i<1)//i值不合法 return false; if(i==1){//插入第i个结点的操作与其他结点不同 LNode *s=(LNode *)malloc(sizeof(LNode));//申请结点 s->data=e;//将值置于s的数据域 s->next=L;//s结点的next指针指向L L=s;//头指针L指向s(新结点) return true; } LNode *p;//声明指针p,用于指向当前扫描到的结点 int j=1;//当前p指向的是第几个结点 //注意:此时j=1 p=L;//重点,要注意在不带头结点的情况下,p指向第1个结点,而不是(第0个结点=头结点) //LNode *p=L; 此时p指向单链表第1个结点,由于此时不带头结点,故第一个结点不是头结点 //此时可以等价于带头结点的LNode *p=L->next; while(p!=NULL && j<i-1){//循环找到第i-1个结点 p=p->next; j++; } if(p==NULL)//i值不合法 return false; LNode *s=(LNode *)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return true; } void DispList(LinkList L){//输出 int i=1; LNode *p=L;//定义一个结点指针p指向第一个结点 while(p!=NULL){ //如果p不为空则循环 printf("第%d个元素为%d\n",i,p->data); p=p->next;//移动指针p遍历链表 i++; } } int main(){ LinkList L; ListInsert(L,1,2); ListInsert(L,2,2); DispList(L); return 0; }
    Processed: 0.011, SQL: 8