数据结构—顺序表,链表

编程入门 行业动态 更新时间:2024-10-12 16:22:16

顺序表

#include <stdio.h>
#include <string.h>
#include <stdlib.h >
//以下为函数运行结果状态代码
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100  //线性表存储空间的初始分配量
#define LISTINCREMENT 10  //线性表存储空间分配增量
typedef int Status; //函数类型,其值为为函数结果状态代码
typedef int ElemType; //假设数据元素为整型
typedef struct
{ElemType *elem; //存储空间基址int length; //当前长度int listsize; //当前分配的存储容量
}SqList;
//实现线性表的顺序存储结构的类型定义Status InitList(SqList *L);//初始化
Status GetElem(SqList L,int i,ElemType *e);//获取元素Status ListInsert(SqList *L,int i,ElemType e);//插入
Status ListDelete(SqList *L,int i);//删除元素
Status Listprintf(SqList L);//遍历元素
int main(void)
{SqList L;InitList(&L);for(int i=0;i<7;i++){ListInsert(&L,L.length+1,(ElemType)i);}Listprintf(L);ElemType e;GetElem(L,3,&e);printf("%d\n",e);ListDelete(&L,3);Listprintf(L);ElemType m=9;ListInsert(&L,3,m);Listprintf(L);return 0;
}Status InitList(SqList *L)
{L->elem=(ElemType*)malloc((LIST_INIT_SIZE *sizeof(ElemType))); //分配空间//若存储分配失败,返回OVERFLOWif(!L->elem)exit(OVERFLOW); //若存储分配失败,返回OVERFLOWL->length=0; //空表,长度为0L->listsize=LIST_INIT_SIZE; //初始存储容量return OK;L->length=0; //空表,长度为0L->listsize=LIST_INIT_SIZE; //初始存储容量return OK;
}Status GetElem(SqList L,int i,ElemType *e)
{if (i<1||i>L.length)return ERROR; //判断i值是否合理,若不合理,返回ERROR*e=L.elem[i-1]; //数组中第i-1的单元存储着线性表中第i个数据元素的内容return OK;
}
Status ListInsert(SqList *L,int i,ElemType e)
{if (i < 1 || i > L->length+1) return ERROR;if (L->length >= L->listsize) {  // 当前存储空间已满,增加分配ElemType *newbase = (ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof (ElemType));if (!newbase) exit(OVERFLOW);            // 存储分配失败L->elem = newbase;              //存储分配成功,让L.elem指向新基址L->listsize += LISTINCREMENT;       // 增加存储容量}ElemType *q = &(L->elem[i-1]);          // q 指示插入位置for (ElemType *p = &(L->elem[L->length-1]); p >= q;  --p)*(p+1) = *p;     // 插入位置及之后的元素右移*q = e;                   // 插入e++L->length;          // 表长增1return OK;}
Status ListDelete(SqList *L,int i){if ((i < 1) || (i > L->length))  return ERROR;ElemType *p = &(L->elem[i-1]);             // p 为被删除元素的位置ElemType *q = L->elem+L->length-1;          // 表尾元素的位置for (++p; p <= q; ++p)  *(p-1) = *p;// 被删除元素之后的元素依次左移--L->length;              // 表长减1return OK;}
Status Listprintf(SqList L)
{printf("(");for(int i=0;i<L.length;i++){printf("%d ",L.elem[i]);}printf(")\n");
}

链表


#include<stdio.h>
#include<stdlib.h>//******宏定义参数内容******
#define DATA_SIZE 200
#define EXTEND_DATA_SIZE 50
#define NO 0
#define OK 1
#define ERROR -1//******基本数据类型别名******
typedef int Status;
typedef char Excelelem;
typedef int Numelem;//******链表数据结构******
typedef struct Node
{Excelelem book;struct Node *next;
}Liststruct;/******链表表头信息******/
typedef struct
{Excelelem book[100]; //表头信息Liststruct *next;Numelem Length;
}ListHead;//******初始化链表******
Liststruct *init(int *i)
{Liststruct *Head,*p,*q;Excelelem ch;Head=q=NULL;printf("请输入顺序表Head的内容:\n");while((ch=getchar())!='\n'){p=(Liststruct *)malloc(sizeof(Liststruct));p->book=ch;if(!(*i)) Head=q=p,(*i)++;else{q->next=p;q=p;(*i)++;}}//注意*q++与(*q)++,有区别!if(q) q->next=NULL;return Head;
}ListHead *Headinit()
{ListHead *Head;Head=(ListHead *)malloc(sizeof(ListHead));Head->Length=0;Head->next=init(&Head->Length);return Head;
}/******打印表中数据内容******/
void DATA_cout(ListHead *Head)
{Liststruct *p=Head->next;while(p!=NULL){printf("%c",p->book);p=p->next;}printf("\n");return ;
}/******打印表中local位置元素内容******/
void Local(ListHead* Head,int local)
{if(Head->Length<local || local<1){printf("警告!不存在%d位置的元素\n",local);return ;}Liststruct *p=Head->next;int i=1;while(p && i++!=local)p=p->next;printf("%c\n",p->book);return ;
}/******找到表中出现的字符ch的位置******/
void DATA_find(ListHead* Head,char ch)
{int i=1,flag=0,count=1;Liststruct *p=Head->next;while(p){if(p->book==ch){flag=1;printf("%d.在第%d个位置出现元素%c\n",count++,i,ch);}p=p->next;i++;}if(!flag)printf("未能找到%c元素!\n",ch);return ;
}/******在第k个元素前插入一个元素******/
void DATA_Insert(ListHead *Head,int k,Excelelem ch)
{if(Head->Length<k || k<1){printf("警告!不存在%d位置的元素\n",k);return ;}Liststruct *p=Head->next,*q,*t;int i=1;while(p && i++!=k)t=p,p=p->next;q=(Liststruct *)malloc(sizeof(Liststruct));q->book=ch;if(k==1){Head->next=q;q->next=p;}else{q->next=p;t->next=q;}Head->Length++;return ;
}/******删除第k个元素******/
void DATA_Delete(ListHead *Head,int k)
{if(Head->Length<k || k<1){printf("警告!不存在%d位置的元素\n",k);return ;}int i=1;Liststruct *p=Head->next,*q;while(p && i++!=k)q=p,p=p->next;if(k==1)Head->next=p->next;elseq->next=p->next;free(p);Head->Length--;return ;
}/******逆置链表******/
void DATA_UN(ListHead *Head)
{Liststruct *p,*q;p=Head->next;Head->next=NULL;while(p!=NULL){q=p;p=p->next;q->next=Head->next;Head->next=q;}return ;
}/******返还内存******/
void List_FREE(ListHead *Head)
{Liststruct *p=Head->next,*q;free(Head);while(p){q=p;p=p->next;free(q);}return ;
}int main()
{ListHead *Head;Numelem i;Excelelem ch;puts("");puts("******等待链表Head初始化!******");Head=Headinit();puts("******链表Head初始化完成!******");printf("链表中的内容为:\n");DATA_cout(Head);printf("链表Head的长度为:\n");printf("%d\n",Head->Length);printf("链表第%d个元素是:\n",i=2);Local(Head,i);printf("链表中出现%c元素的位置分别是:\n",ch='6');DATA_find(Head,ch);printf("在链表的第%d个元素之前插上%c\n",i=4,ch='9');DATA_Insert(Head,i,ch);printf("链表中的内容为:\n");DATA_cout(Head);printf("将链表中第%d个元素删除\n",i=3);DATA_Delete(Head,i);printf("链表中的内容为:\n");DATA_cout(Head);printf("将链表所有元素逆置,请稍后...\n\n");  //多种方法DATA_UN(Head);printf("链表中的内容为:\n");DATA_cout(Head);puts("******链表Head使用完毕!******\n");List_FREE(Head);return 0;
}
--------------------- 
作者:Caczhtus 
来源:CSDN 
原文:blog.csdn.net/calculate23/article/details/79758845 
版权声明:本文为博主原创文章,转载请附上博文链接!

更多推荐

数据结构,顺序,链表

本文发布于:2023-05-28 00:44:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/308167.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据结构   顺序   链表

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!