C语言线性结构和非线性结构怎么区分啊?

Python047

C语言线性结构和非线性结构怎么区分啊?,第1张

一、线性结构是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。常用的线性结构有:线性表,栈,队列,双队列,数组,串。二、非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。1、层次结构是按层次划分的数据元素的集合,指定层次上元素可以是零个或多个处于下一个层次上的直接所属下层元素。最典型的层次结构即为树形结构,比如Linux文件系统即为树形结构。2、群结构中所有的元素之间无顺序关系,最典型的群结构是集合和图。

#include"stdio.h"\x0d\x0a#include\x0d\x0a \x0d\x0atypedef char ElemType\x0d\x0a \x0d\x0atypedef struct LNode\x0d\x0a{ElemType data\x0d\x0astruct LNode *next\x0d\x0a}LinkList\x0d\x0a \x0d\x0avoid CreatListF(LinkList *&L,ElemType a[],int n) //头插法建表\x0d\x0a{\x0d\x0a LinkList *sint i\x0d\x0a L=(LinkList *)malloc(sizeof(LinkList))\x0d\x0a L->next=NULL\x0d\x0a for(i=0idata=a[i]\x0d\x0a s->next=L->next\x0d\x0a L->next=s\x0d\x0a }\x0d\x0a}\x0d\x0a \x0d\x0avoid CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建表\x0d\x0a{\x0d\x0a LinkList *s,*rint i\x0d\x0a L=(LinkList *)malloc(sizeof(LinkList))\x0d\x0a r=L\x0d\x0a for(i=0idata=a[i]\x0d\x0a r->next=s\x0d\x0a r=s\x0d\x0a }\x0d\x0a r->next=NULL\x0d\x0a}\x0d\x0a\x0d\x0avoid InitList(LinkList *&L)//初始化线性表\x0d\x0a{\x0d\x0a L=(LinkList *)malloc(sizeof(LinkList))\x0d\x0a L->next=NULL\x0d\x0a}\x0d\x0a \x0d\x0avoid DestroyList(LinkList *&L) //销毁线性表\x0d\x0a{\x0d\x0a LinkList *p=L,*q=p->next\x0d\x0a while(q!=NULL)\x0d\x0a {\x0d\x0a free(p)\x0d\x0a p=q\x0d\x0a q=p->next\x0d\x0a }\x0d\x0a free(p)\x0d\x0a}\x0d\x0a \x0d\x0aint ListEmpty(LinkList *L)//判断线性表是否为空\x0d\x0a{\x0d\x0a return(L->next==NULL)\x0d\x0a}\x0d\x0a \x0d\x0aint ListLength(LinkList *L)//求线性表的长度\x0d\x0a{\x0d\x0a LinkList *p=Lint n=0\x0d\x0a while(p->next!=NULL)\x0d\x0a {\x0d\x0a n++p=p->next\x0d\x0a }\x0d\x0a return(n)\x0d\x0a}\x0d\x0a \x0d\x0avoid DispList(LinkList *L) //输出线性表\x0d\x0a{\x0d\x0a LinkList *p=L->next\x0d\x0a while(p!=NULL)\x0d\x0a {\x0d\x0a printf("%c",p->data)\x0d\x0a p=p->next\x0d\x0a }\x0d\x0a}\x0d\x0a \x0d\x0aint GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素值\x0d\x0a{\x0d\x0a int j=0\x0d\x0a LinkList *p=L\x0d\x0a while(jnext\x0d\x0a }\x0d\x0a if(p==NULL)\x0d\x0a return 0\x0d\x0a else\x0d\x0a {\x0d\x0a e=p->datareturn 1\x0d\x0a }\x0d\x0a}\x0d\x0a \x0d\x0aint LocateElem(LinkList *L,ElemType e)//按元素值查找\x0d\x0a{\x0d\x0a LinkList *p=L->next\x0d\x0a int i=1\x0d\x0a while(p!=NULL&&p->data!=e)\x0d\x0a {\x0d\x0a p=p->nexti++\x0d\x0a }\x0d\x0a if(p==NULL)return(0)\x0d\x0a else return(i)\x0d\x0a}\x0d\x0a \x0d\x0aint ListInsert(LinkList *&L,int i,ElemType e) //插入数据元素\x0d\x0a{\x0d\x0a int j=0\x0d\x0a LinkList *p=L,*s\x0d\x0a while(jnext\x0d\x0a }\x0d\x0a if(p==NULL)return 0\x0d\x0a else\x0d\x0a {\x0d\x0a s=(LinkList *)malloc(sizeof(LinkList))\x0d\x0a s->data=es->next=p->nextp->next=s\x0d\x0a return 1\x0d\x0a }\x0d\x0a}\x0d\x0a \x0d\x0aint ListDelete(LinkList *&L,int i,ElemType &e) //删除数据元素\x0d\x0a{\x0d\x0a int j=0\x0d\x0a LinkList *p=L,*q\x0d\x0a while(jnext\x0d\x0a }\x0d\x0a if(p==NULL)\x0d\x0a return 0\x0d\x0a else\x0d\x0a {\x0d\x0a q=p->next\x0d\x0a if(q==NULL)return 0\x0d\x0a e=q->data\x0d\x0a p->next=q->next\x0d\x0a free(q)\x0d\x0a return 1\x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a ElemType e,a[5]={'a','b','c','d','e'}\x0d\x0a LinkList *h\x0d\x0a \x0d\x0a InitList(h) //初始化顺序表h\x0d\x0a CreateListR(h,&a[0],5)//依次采用尾插入法插入a,b,c,d,e元素\x0d\x0a printf("单链表为:")\x0d\x0a DispList(h) printf("\n")//输出顺序表h\x0d\x0a \x0d\x0a printf("该单链表的长度为:")\x0d\x0a printf("%d",ListLength(h))printf("\n") //输出顺序表h的长度\x0d\x0a if(ListEmpty(h)) printf("该单链表为空。\n") \x0d\x0a else printf("该单链表不为空。\n") //判断顺序表h是否为空\x0d\x0a \x0d\x0a GetElem(h,3,e)printf("该单链表的第3个元素为:")\x0d\x0a printf("%c",e)printf("\n") //输出顺序表h的第3个元素\x0d\x0a printf("该单链表中a的位置为:")\x0d\x0a printf("%d",LocateElem(h,'a'))printf("\n") //输出元素'a'的位置\x0d\x0a \x0d\x0a ListInsert(h,4,'f') //在第4个元素位置插入'f'素\x0d\x0a printf("在第4 个元素位置上插入'f'后单链表为:")\x0d\x0a DispList(h)printf("\n") //输出顺序表h\x0d\x0a \x0d\x0a ListDelete(h,3,e) //删除L的第3个元素\x0d\x0a printf("删除第3个元素后单链表为:")\x0d\x0a DispList(h)printf("\n") //输出顺序表h\x0d\x0a \x0d\x0a DestroyList(h)//释放顺序表h\x0d\x0a return 0\x0d\x0a}