2.3 线性表的链式表示

打印 上一主题 下一主题

主题 841|帖子 841|积分 2523

知识总览

2.3.1 单链表的定义
知识总览

单链表定义
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. struct LNode{
  5.         int data;
  6.         struct LNode *next;
  7. };
  8. int main(){       
  9.         struct LNode *p=(struct LNode*)malloc(sizeof(struct LNode));
  10.     return 0;
  11. }
复制代码
typedef重命名

typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
等同于
struct LNode{
    int data;
    struct LNode *next;
};
typedef struct LNode LNode;
typedef struct LNode *LinkList;
 
头插法建立单链表
头插法
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. typedef struct LNode{
  5.   int data;
  6.   struct LNode *next;
  7. }LNode,*LinkList;
  8. LinkList List_HeadInsert(LinkList &L){
  9.         LNode *s;
  10.         int x;
  11.         L=(LinkList)malloc(sizeof(LNode));  //创建头节点
  12.         L->next=NULL;                  //初始为空链表
  13.         scanf("%d",&x);                   //输入节点的值
  14.         while(x!=9999){                   //输出9999表示结束
  15.                 s=(LNode*)malloc(sizeof(LNode));  //创建新节点
  16.                 s->data=x;
  17.                 s->next=L->next;
  18.                 L->next=s;                  //将新节点插入表中,L为头指针
  19.                 scanf("%d",&x);
  20.         }
  21.         return L;
  22. }
  23. int main(){
  24.         LinkList L;
  25.         List_HeadInsert(L);
  26. }
复制代码
强调这是一个单链表      ————使用LinkList
强调这是一个节点         ————使用LNode*
 
不带头节点的单链表
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. typedef struct LNode{
  5.   int data;
  6.   struct LNode *next;
  7. }LNode,*LinkList;
  8. //初始化一个空的单链表
  9. bool InitList(LinkList &L){
  10.         L=NULL;    //空表,//防止脏数据
  11.         return true;
  12. }
  13. //判断单链表是否为空
  14. bool Empty(LinkList L){
  15.         return (L==NULL);
  16. }
  17. int main(){
  18.         LinkList L; //声明一个指向单链表的指针 //此处并没有创建一个节点
  19.         InitList(L);
  20.         Empty(L);
  21. }
复制代码
带头结点的单链表
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. typedef struct LNode{
  5.   int data;
  6.   struct LNode *next;
  7. }LNode,*LinkList;
  8. //初始化一个单链表 (带头结点)
  9. bool InitList(LinkList &L){
  10.     L=(LNode*)malloc(sizeof(LNode));
  11.         if(L==NULL)
  12.             return false;
  13.     L->next=NULL;
  14.         return true;
  15. }
  16. //判断单链表是否为空 (带头结点)
  17. bool Empty(LinkList L){
  18.     if(L->next==NULL)
  19.            return  true;
  20.         else
  21.            return false;
  22. }
  23. int main(){
  24.         LinkList L; //声明一个指向单链表的指针
  25.         InitList(L);
  26.         Empty(L);
  27. }
复制代码
 总结   2.3.2.1知识总览    按位序插入(带头结点)
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. typedef struct LNode{
  5.   int data;
  6.   struct LNode *next;
  7. }LNode,*LinkList;
  8. //初始化一个单链表 (带头结点)
  9. bool InitList(LinkList &L){
  10.     L=(LNode*)malloc(sizeof(LNode));
  11.         if(L==NULL)
  12.             return false;
  13.     L->next=NULL;
  14.         return true;
  15. }
  16. //判断单链表是否为空 (带头结点)
  17. bool Empty(LinkList L){
  18.     if(L->next==NULL)
  19.            return  true;
  20.         else
  21.            return false;
  22. }
  23. //在第i个位置插入元素e(带头结点)
  24. bool ListInsert(LinkList &L,int i,int e){
  25.         if(i<1)
  26.             return false;
  27.         LNode *p;  //指针p指向当前扫描到的结点
  28.         int j=0;   //当前p指向的是第几个结点
  29.         p=L;     //L指向头结点,头结点是第0个结点(不存数据)
  30.         while(p!=NULL&&j<i-1){ //循环找到第i-1 个结点 //找位置
  31.                 p=p->next;
  32.                 j++;
  33.         }
  34.         if(p==NULL)   //i值不合法
  35.            return false;
  36.         LNode *s=(LNode*)malloc(sizeof(LNode));
  37.         s->data=e;
  38.         s->next=p->next;
  39.         p->next=s;   //将结点s连到p之后
  40.         return true; //插入成功
  41. }
  42. int main(){
  43.         LinkList L; //声明一个指向单链表的指针
  44.         InitList(L);
  45.         Empty(L);
  46.         ListInsert(L,1,9);
  47. }
复制代码
        不带头节点
 
 

LNode * GetElem(LinkList L ,int i){
  int j=1;
  LNode *p=L->next;
  if(i==0)
    return L;
  if(i

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表