当前位置:   article > 正文

C语言数据结构--线性表常用操作代码合集_数据结构线性表c语言代码

数据结构线性表c语言代码

概述

为方便调试,接下来的代码中,ElemType类型只用 int类型来表示,大家可根据需要来进行替换。

一、顺序表

1.1顺序表初始化

(1)静态分配初始化

  1. #include<stdio.h>
  2. # define MaxSize 10
  3. typedef struct{
  4. int data[MaxSize];
  5. int length;
  6. }SqList;
  7. void InitList(SqList &L)
  8. {
  9. L.length = 0;
  10. }

(2)动态分配初始化

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define InitSize 10 //初始表长
  4. typedef struct{
  5. int *data; //指示动态分配数组的指针
  6. int length; //数组当前长度
  7. int MaxSize; //数组最大容量
  8. }SeqList; //动态分配数组顺序表的定义
  9. void InitList(SeqList &L)
  10. {
  11. L.data =(int *)malloc(sizeof(int)*InitSize); //分配存储空间
  12. L.length = 0; //初始长度为0
  13. L.MaxSize = InitSize; //最大容量暂定为初始容量
  14. }

1.2顺序表的创建

  1. void CreateList(SqList &L)
  2. {
  3. int x = 0;
  4. int i = 0;
  5. scanf("%d",&x);
  6. while(x!=9999) //输入9999停止输入
  7. {
  8. L.data[i]=x;
  9. i++;
  10. L.length++;
  11. scanf("%d",&x);
  12. }
  13. }

1.3插入操作

在顺序表的第i个位置插入新元素e

  1. bool ListInsert(SqList &L,int i,int e)
  2. {
  3. if(i<1 || i>L.length+1) //判断i的范围是否有效
  4. return false;
  5. if(L.length >= MaxSize) //判断空间是否已满
  6. return false;
  7. int j = 0;
  8. for(j=L.length;j>=i;j--) //将第i个元素及之后的元素后移
  9. {
  10. L.data[j]=L.data[j-1];
  11. }
  12. L.data[i-1]=e; //在第i个位置放入e
  13. L.length++; //线性表长度加1
  14. return true;
  15. }

1.4删除操作

  1. bool ListDelete(SqList &L,int i,int &e)
  2. {
  3. if(i<1 || i>L.length)
  4. return false;
  5. int j = 0;
  6. e=L.data[i-1]; //将被删除的元素赋给e
  7. for(j=i;j<L.length;j++) //将第i个位置处的元素前移
  8. {
  9. L.data[j-1]=L.data[j];
  10. }
  11. L.length--; //线性表长度减一
  12. return true;
  13. }

1.5按值查找

按值查找:在顺序表L中查找第一个元素值等于e的元素,并返回其位序。

  1. int LocateElem(SqList L,int e)
  2. {
  3. int i = 0;
  4. for(i=0;i<L.length;i++)
  5. {
  6. if(L.data[i]==e)
  7. return i+1; //下标为i的元素值等于e,返回其位序i+1
  8. }
  9. return 0; //退出循环,说明查找失败
  10. }

1.6按位查找

  1. int GetElem(SqList L,int i)
  2. {
  3. return L.data[i-1]; //返回第i个位置的元素值
  4. }

1.7输出操作

  1. void PrintList(SqList L)
  2. {
  3. int i = 0;
  4. for(i=0;i<L.length ;i++)
  5. {
  6. printf("%d ",L.data[i]);
  7. }
  8. }

 二、单链表

2.1单链表结点类型及初始化

(1)带头结点

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct LNode{
  4. int data;
  5. struct LNode *next;
  6. }LNode,*LinkList;
  7. bool InitList(LinkList &L)
  8. {
  9. L=(LNode*)malloc(sizeof(LNode)); //创建头结点
  10. L->next = NULL; //此处亦可写为 (*L).next = NULL ,头结点之后暂无元素结点
  11. return true;
  12. }

(2)不带头结点

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct LNode{
  4. int data;
  5. struct LNode *next;
  6. }LNode,*LinkList;
  7. bool InitList(LinkList &L)
  8. {
  9. L=NULL;
  10. return true;
  11. }

2.2求表长

  1. int length(LinkList L)
  2. {
  3. int len = 0;
  4. LNode *p=L;
  5. while(p->next != NULL)
  6. {
  7. p=p->next ;
  8. len++;
  9. }
  10. return len;
  11. }

2.3按序号查找结点

  1. LNode* GetElem(LinkList L,int i)
  2. {
  3. LNode *p = L; //p指向当前扫描到的结点
  4. int j = 0; //头结点是第0个结点
  5. while(p!=NULL && j<i) //循环找到第i个结点
  6. {
  7. p=p->next ;
  8. j++;
  9. }
  10. return p; //返回第i个结点的指针或NULL
  11. }

2.4按值查找结点

  1. LNode * LocateElem(LinkList L,int e)
  2. {
  3. LNode *p = L->next ;
  4. while(p!=NULL&&p->data!=e)
  5. {
  6. p=p->next;
  7. }
  8. return p;
  9. }

2.5插入结点操作

在第i个结点处插入元素e,先找到第i-1个结点,再在其后插入

  1. bool ListInsert(LinkList &L,int i, int e)
  2. {
  3. LNode *p=L;
  4. int j = 0;
  5. while(p!=NULL && j<i-1)
  6. {
  7. p=p->next ;
  8. j++;
  9. }
  10. if(p==NULL) //i值不合法
  11. return false;
  12. LNode *s=(LNode *)malloc(sizeof(LNode));
  13. s->data =e;
  14. s->next =p->next ;
  15. p->next = s;
  16. return true;
  17. }

2.6删除结点操作

删除第i个结点,并用e返回删除结点的值

  1. bool ListDelete(LinkList &L,int i,int &e)
  2. {
  3. LNode *p=L;
  4. int j = 0;
  5. while(p!=NULL&&j<i-1) //循环找到第i-1个结点
  6. {
  7. p=p->next ;
  8. j++;
  9. }
  10. if(p==NULL ||p->next == NULL) //i值不合法
  11. return false;
  12. LNode *q=p->next ; //令q 指向被删除结点
  13. e=q->data ; //用e存储被删除结点的值
  14. p->next = q->next ;
  15. free(q); //释放结点存储空间
  16. return true;
  17. }

2.7头插法建立单链表

  1. LinkList List_HeadInsert(LinkList &L)
  2. {
  3. LNode *s;
  4. int x = 0;
  5. L=(LNode*)malloc(sizeof(LNode)); //创建头结点
  6. L->next=NULL; //初始为空链表
  7. scanf("%d",&x);
  8. while(x!=9999) //输入9999表示结束
  9. {
  10. s=(LNode*)malloc(sizeof(LNode)); //创建新结点
  11. s->data = x;
  12. s->next =L->next ;
  13. L->next=s ; //将新结点插入表中,L为头指针
  14. scanf("%d",&x);
  15. }
  16. return L;
  17. }

2.8尾插法建立单链表

  1. LinkList List_TailInsert(LinkList &L)
  2. {
  3. int x = 0;
  4. L=(LNode*)malloc(sizeof(LNode)); //创建头结点
  5. LNode *s;
  6. LNode *r=L; //尾指针
  7. scanf("%d",&x);
  8. while(x!=9999) //输入9999表示结束
  9. {
  10. s=(LNode*)malloc(sizeof(LNode)); //创建新结点
  11. s->data = x;
  12. r->next =s ;
  13. r = s ; //将新结点插入表中,L为头指针
  14. scanf("%d",&x);
  15. }
  16. r->next =NULL; //尾结点指针置空
  17. return L;
  18. }

三、双链表

3.1双链表插入操作

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct DNode{
  4. int data;
  5. struct DNode *prior,*next; //前驱和后继指针
  6. }DNode, *DLinkList;
  7. bool ListInsert(DLinkList &L,int i,int e)
  8. {
  9. int j = 0;
  10. DNode *p = L;
  11. while(p!=NULL &&j<i-1)
  12. {
  13. p=p->next ;
  14. j++;
  15. }
  16. if(p==NULL)
  17. return false;
  18. DNode *s=(DNode *)malloc(sizeof(DNode));
  19. s->data = e;
  20. s->next = p->next ;
  21. s->prior = p;
  22. p->next->prior = s;
  23. p->next=s;
  24. return true;
  25. }

3.2双链表删除操作

  1. bool ListDelete(DLinkList &L,int i,int &e)
  2. {
  3. int j = 0;
  4. DNode *p = L;
  5. while(p!=NULL &&j<i-1)
  6. {
  7. p=p->next ;
  8. j++;
  9. }
  10. if(p==NULL ||p->next == NULL)
  11. return false;
  12. DNode *q=p->next ;
  13. e=q->data ;
  14. q->next->prior =p;
  15. p->next = q->next ;
  16. free(q);
  17. return true;
  18. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/529429?site
推荐阅读
相关标签
  

闽ICP备14008679号