这是我做过的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;
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;
}