数据结构-线性表之单链表

这是我做过的GitHub小项目(知天气),菜鸟入门还需大家的鼓励,大家可怜可怜给个赞吧哈哈!我不管我最帅。https://github.com/Xxianglei/HeartWeather    


   单链表,又叫线性链表。单链表的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。整个链表的存取必须是从头指针开始进行,头指针指示链表中第一个节点(即第一个数据元素的储存映像)。为了表示每个数据元素ai与后继ai+1的关系。用了两个域来储存,一个是数据域(存储数据元素),第二个是指针域(存储直接后继存储的位置的域)。这两个域被称为结点。


首先先看一下单链表的优缺点: 
优点是:它的插入和删除某个单链表中的元素时间复杂度较低为O(1)。 

而缺点是:它的查找的时间复杂度较高为O(n)。



那就看看怎么定义线性表的吧。

#include <stdio.h>  
#include<stdlib.h> 
#define TRUE   1  
#define FALSE   0  
#define OK    1  
#define ERROR   0  
#define INFEASIBLE -1  
#define OVERFLOW -2   
#define N = 100           //以上是一些宏定义和头文件,在此不多赘述   
typedef int Status;  
typedef int ElemType;  
typedef struct LNode{
ElemType data;
struct LNode  *next;
}LNode,*LinkList;         //LNode *L  或者LinkList L  L是单链表的头指针


接着是逆序创建一个空的单链表,并输入数据


void CreateListF(LinkList &L,int n)   //逆为序输入n个元素的值,建立带表头节点的单链表L 
{
LinkList s,p;
int i;                                  //  初始化   
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;                       //创建头节点,其next域置为NULL
for(i=n;i>0;i--)  
{
p=(LinkList)malloc(sizeof(LNode));  
scanf ("%d",&p->data);
p->next=L->next;        //将p放在最后一个节点逆序建表 
L->next=p;            //循环建立数据节点  插入到表头 

}

建表完毕接下来是插入算法


Status ListDelete_L(LinkList &L,int i,ElemType &e){              //删除第i个元素  用e返回值 
LinkList p,q;                       //q是要删除的节点 
int j; 
p=L;
j=0;
while(p->next&&j<i-1){           //寻找第i个节点,并且p指向他的前驱 
p=p->next;
++j; 
}
if(!(p->next)||j>i-1){           //判断删除位置是否合理 
return ERROR;
}
q=p->next;              //由q带走p的next指针域 
p->next=q->next;          //  将p和q后一个元素联系起来 
e=q->data;
free(q);
return OK;

}

为了方便观察数据元素变化,在编写一个遍历出入的算法

void DispList(LinkList L)
{
LinkList p=L->next;                //p指向开始节点
while(p!=NULL)             //p不为NULL,输出*p节点的data域
{
printf("%d ",p->data);
p=p->next;             //p移向下一个节点
}
printf("\n");
}


总体代码如下,经供参考  !

#include <stdio.h>  
#include<stdlib.h> 
#define TRUE   1  
#define FALSE   0  
#define OK    1  
#define ERROR   0  
#define INFEASIBLE -1  
#define OVERFLOW -2   
#define N = 100         
typedef int Status;  
typedef int ElemType;  
typedef struct LNode{
ElemType data;
struct LNode  *next;
}LNode,*LinkList;




Status GetElem_L(LinkList L,int i,ElemType &e){
LinkList p;
int j; 
p=L->next;     //走第一个节点开始查 
j=1;
while(p&&j<i){          //查第i个元素 
p=p->next;            //p后移 
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e){     //在第i个元素位置之前插入元素e 
LinkList p,s;
int j; 
p=L;
j=0;                     //设置一个计数器 
while(L&&j<i-1)              //寻找第i-1个节点 
{
p=p->next;
++j;
}
if(!L||j>i-1) return ERROR;               //i小于1或者大于表长+1 
s=(LinkList)malloc (sizeof(LNode));      //生成新节点 
s->data=e;                               //插入值 
s->next=p->next;           //p的指向下一位的指针复制给s  让s和下一个元素联系起来 
p->next=s;           //p的next指向s 
return OK;
}

Status ListDelete_L(LinkList &L,int i,ElemType &e){              //删除第i个元素  用e返回值 
LinkList p,q;                       //q是要删除的节点 
int j; 
p=L;
j=0;
while(p->next&&j<i-1){           //寻找第i个节点,并且p指向他的前驱 
p=p->next;
++j; 
}
if(!(p->next)||j>i-1){           //判断删除位置是否合理 
return ERROR;
}
q=p->next;              //由q带走p的next指针域 
p->next=q->next;          //  将p和q后一个元素联系起来 
e=q->data;
free(q);
return OK;
}
void CreateListF(LinkList &L,int n)   //逆为序输入n个元素的值,建立带表头节点的单链表L 
{
LinkList s,p;
int i;                                  //  初始化   
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;                       //创建头节点,其next域置为NULL
for(i=n;i>0;i--)  
{
p=(LinkList)malloc(sizeof(LNode));  
scanf ("%d",&p->data);
p->next=L->next;        //将p放在最后一个节点逆序建表 
L->next=p;            //循环建立数据节点  插入到表头 

}

}
void DispList(LinkList L)
{
LinkList p=L->next;                //p指向开始节点
while(p!=NULL)             //p不为NULL,输出*p节点的data域
{
printf("%d ",p->data);
p=p->next;             //p移向下一个节点
}
printf("\n");
}

int main()
{
    LinkList  L,L2;
    int i,j,m,x,y;  
    //InitList(L); 
    printf("逆序建立一个元素个数是6的链表!!!\n"); 
    CreateListF(L,6) ;
    printf("逆序建立表成功!!!\n\n");
     DispList(L);
printf("\n在第3位插入一个元素  10!!!\n\n") ;
    ListInsert_L(L,3,10); 
    DispList(L);
    printf("\n删除第四个元素!!!\n"); 
    ListDelete_L(L,4,m);
    printf("\n   %d   被删除了!!!\n\n",m);
    DispList(L);
    printf("\n查找第3个元素!!!\n");
    GetElem_L( L,3,x);
    printf("\n查找结果  %d !!!",x);
    return 0;
}

这是我做过的GitHub小项目(知天气),菜鸟入门还需大家的鼓励,大家可怜可怜给个赞吧哈哈!我不管我最帅。https://github.com/Xxianglei/HeartWeather    


   单链表,又叫线性链表。单链表的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。整个链表的存取必须是从头指针开始进行,头指针指示链表中第一个节点(即第一个数据元素的储存映像)。为了表示每个数据元素ai与后继ai+1的关系。用了两个域来储存,一个是数据域(存储数据元素),第二个是指针域(存储直接后继存储的位置的域)。这两个域被称为结点。


首先先看一下单链表的优缺点: 
优点是:它的插入和删除某个单链表中的元素时间复杂度较低为O(1)。 

而缺点是:它的查找的时间复杂度较高为O(n)。



那就看看怎么定义线性表的吧。

猜你喜欢

转载自blog.csdn.net/u011583316/article/details/78033500