单链表是线性表的一种链式存储结构,属于线性结构,是通过指针来实现链式存储的,相比顺序表,存储密度更低,针对插入、删除等操作,其效率更高。
相比线性结构,单链表需要提高效率,则需要针对每一个元素,可以不连续存储,但是必须知道其后继元素的地址。
因此,对于任一数据元素在存储其自身的信息(数据信息)外,还需要存储其后继信息(其后继的存储地址)。
因此,便产生构成单链表的结点,其由存储元素信息的数据域和存储后继位置的指针域组成。
头指针:单链表中第一个结点的存储位置。
头结点:单链表的第一个结点前附设一结点。
最后一个结点,无后继,则其指针域为空。
(一)单链表的结构
typedef struct Node { DataType data; struct Node *next; }LNode,*LinkList;
(二)单链表上的基本运算实现
(1)建立不带头结点的单链表
(a)从头部插入(与读入数据顺序相反
(b)从尾部插入(与读入数据顺序相同)LinkList Creat_LinkList() { LinkList L; LNode *s; L=NULL; int x; scanf("%d",&x); while(x!=flag) { s=(LNode *)malloc(sizeof(LNode)); s->data=x; s->next=L; L=s; scanf("%d",&x); } return L; }
(2)求表长(a)带头结点LinkList Creat_LinkList() { LinkList L; LNode *s,*r; L=r=NULL; int x; scanf("%d",&x); while(x!=flag) { s=(LNode *)malloc(sizeof(LNode)); s->data=x; if(L==NULL) L=s; else r->next=s; r=s; scanf("%d",&x); } if(r) r->next=NULL; return L; }
(b)不带头结点int Length_LinkList(LinkList L) { int i=0; LNode *p; p=L; while(p->next) { p=p->next; i++; } return i; }
int Length_LinkList(LinkList L) { int i=0; LNode *p; p=L; while(p) { i++; p=p->next; } return i; }
讨论技术欢迎加群:翻转世界IT 386707638#include<stdio.h> #include<string.h> #include<stdlib.h> typedef int DataType; #define flag 0 typedef struct Node { DataType data; struct Node *next; }LNode,*LinkList;//定义单链表 LNode *Creat_LinkList()//创建带头结点的单链表 { LinkList L; int x; LNode *s,*r; s=(LNode *)malloc(sizeof(LNode)); s->next=NULL; L=r=s; scanf("%d",&x); while(x!=flag) { s=(LNode *)malloc(sizeof(LNode)); s->data=x; if(L->next==NULL) L->next=s; else r->next=s; r=s; scanf("%d",&x); } if(r!=NULL) r->next=NULL; return L; } LinkList reverse(LinkList L)//单链表的倒置算法 { LNode *p,*q; p=L->next; L->next=NULL; while(p) { q=p; p=p->next; q->next=L->next; L->next=q; } return L; } int main() { LinkList H; H=Creat_LinkList(); LNode *p; p=H->next; while(p) { printf(" %d",p->data); p=p->next; } printf("\n"); LinkList S; S=reverse(H); LNode *q; q=S->next; while(q) { printf(" %d",q->data); q=q->next; } printf("\n"); system("pause"); return 0; }