线性表
来源:互联网 发布:淘宝拖鞋类目 编辑:程序博客网 时间:2024/06/11 18:30
数据结构(C语言实现)
分类: C/C++ 2013-03-18 23:26 172人阅读 评论(0)收藏 举报
1.线性表的顺序存储
- #include<stdio.h>
- #include<stdlib.h>
- #define MAX 20
- typedef int DataType ;
- typedef struct
- {
- int length;
- DataType data[MAX];
- }SqList;
- int InitList(SqList *L)
- {
- //L=(SqList *)malloc(sizeof(SqList));
- L->length=0;
- return 0;
- }
- int ListEmpty(SqList L)
- {
- if(L.length==0)
- return 1;
- else
- return 0;
- }
- int ClearList(SqList *L)
- {
- L->length=0;
- return 0;
- }
- int getData(SqList *L,int i,DataType *e)
- {
- if(L->length==0||i<1||i>L->length)
- return 0;
- else
- *e=L->data[i-1];
- return 1;
- }
- int ListInsert(SqList *L,int i,DataType e)
- {
- int k;
- if(L->length==MAX)
- {
- // printf("顺序表已满\n");
- return 0;
- }
- if(i<0||i>L->length+1)
- {
- //printf("插入位置不合法\n");
- return 0;
- }
- else
- {
- for(k=L->length-1;k>=i-1;k--)
- L->data[k+1]=L->data[k];
- }
- L->data[i-1]=e;
- L->length++;
- return 1;
- }
- int ListDelete(SqList *L,int i,DataType *e)
- {
- int k;
- if(i<1||i>L->length)
- return 0; //删除位置不正确
- if(L->length==0)
- return 0; //空表
- *e=L->data[i-1];
- if(i<=L->length)
- {
- for(k=i;k<L->length;k++)
- L->data[k-1]=L->data[k];
- }
- L->length--;
- return 0;
- }
- int ListTraverse(SqList L)
- {
- int i;
- for(i=0;i<=L.length-1;i++)
- {
- printf("%3d",L.data[i]);
- }
- printf("\n");
- return 1;
- }
- int main()
- {
- int i,j,k;
- SqList L;
- DataType e;
- i=InitList(&L);
- printf("初始化后表长:%d\n",L.length);
- for(j=1;j<=5;j++)
- i=ListInsert(&L,1,j);
- printf("表头插入数字1到5之后:");
- ListTraverse(L);
- printf("插入五个数字后表长:%d\n",L.length);
- i=ListEmpty(L);
- printf("此时表是否为空(1代表是,0代表否):%d\n",i);
- i=ClearList(&L);
- printf("\n清空表后,表长为%d\n",L.length);
- printf("此时表是否为空(1代表是,0代表否):%d\n",i);
- for(j=1;j<=5;j++)
- i=ListInsert(&L,j,j);
- printf("表尾插入五个数字之后:");
- ListTraverse(L);
- printf("插入五个数字后表长:%d\n",L.length);
- getData(&L,3,&e);
- printf("第三个数字是:%d\n",e);
- i=ListDelete(&L,2,&e);
- printf("删除第2个数据后为:");
- ListTraverse(L);
- printf("被删除的数字是:%d\n",e);
- i=L.length;
- printf("输入想要删除的数据的序号:");
- scanf("%d",&k);
- if(k>i||k<=0)
- printf("删除位置不正确\n");
- else
- {
- i=ListDelete(&L,k,&e);
- printf("删除第%d个数字的值为%d,删除后表为",k,e);
- ListTraverse(L);
- }
- return 0;
- }
#include<stdio.h>#include<stdlib.h>#define MAX 20typedef int DataType ;typedef struct{ int length; DataType data[MAX];}SqList;int InitList(SqList *L){ //L=(SqList *)malloc(sizeof(SqList)); L->length=0; return 0;}int ListEmpty(SqList L){ if(L.length==0) return 1; else return 0;}int ClearList(SqList *L){ L->length=0; return 0;}int getData(SqList *L,int i,DataType *e){ if(L->length==0||i<1||i>L->length) return 0; else *e=L->data[i-1]; return 1;}int ListInsert(SqList *L,int i,DataType e){ int k; if(L->length==MAX) { // printf("顺序表已满\n"); return 0; } if(i<0||i>L->length+1) { //printf("插入位置不合法\n"); return 0; } else { for(k=L->length-1;k>=i-1;k--) L->data[k+1]=L->data[k]; } L->data[i-1]=e; L->length++; return 1;}int ListDelete(SqList *L,int i,DataType *e){ int k; if(i<1||i>L->length) return 0; //删除位置不正确 if(L->length==0) return 0; //空表 *e=L->data[i-1]; if(i<=L->length) { for(k=i;k<L->length;k++) L->data[k-1]=L->data[k]; } L->length--; return 0;}int ListTraverse(SqList L){ int i; for(i=0;i<=L.length-1;i++) { printf("%3d",L.data[i]); } printf("\n"); return 1;}int main(){ int i,j,k; SqList L; DataType e; i=InitList(&L); printf("初始化后表长:%d\n",L.length); for(j=1;j<=5;j++) i=ListInsert(&L,1,j); printf("表头插入数字1到5之后:"); ListTraverse(L); printf("插入五个数字后表长:%d\n",L.length); i=ListEmpty(L); printf("此时表是否为空(1代表是,0代表否):%d\n",i); i=ClearList(&L); printf("\n清空表后,表长为%d\n",L.length); printf("此时表是否为空(1代表是,0代表否):%d\n",i); for(j=1;j<=5;j++) i=ListInsert(&L,j,j); printf("表尾插入五个数字之后:"); ListTraverse(L); printf("插入五个数字后表长:%d\n",L.length); getData(&L,3,&e); printf("第三个数字是:%d\n",e); i=ListDelete(&L,2,&e); printf("删除第2个数据后为:"); ListTraverse(L); printf("被删除的数字是:%d\n",e); i=L.length; printf("输入想要删除的数据的序号:"); scanf("%d",&k); if(k>i||k<=0) printf("删除位置不正确\n"); else { i=ListDelete(&L,k,&e); printf("删除第%d个数字的值为%d,删除后表为",k,e); ListTraverse(L); } return 0;}
结果:
1>数组的下表从0开始,防止数组越界
2>注意指针的使用
3>设计程序时尽量考虑全面,各种可能出现的问题都包含在内
4>变量命名要有一定的含义,见其名知其意
2.线性表链式存储
- #include<stdio.h>
- #include<stdlib.h>
- typedef int ElemType;
- typedef struct Node
- {
- ElemType data;
- struct Node *next;
- }Node,*LinkList;
- int InitList(LinkList *L)//初始化
- {
- *L=(LinkList)malloc(sizeof(Node));
- if(!(*L))
- return 0;
- else
- (*L)->next=NULL;
- return 1;
- }
- //LinkList L,L有定义时,值要么为NULL,为一个空表,要么为第一个节点的地址,既头指针
- int ListLength(LinkList L)//求表长,LinkList L指某链表的第一个节点地址放在指针变量L中
- {
- int i=0;
- LinkList p=L->next;
- while(p)
- {
- i++;
- p=p->next;
- }
- return i;
- }
- int ListEmpty(LinkList L)
- {
- LinkList p=L->next;
- if(p)
- return 0;
- else
- return 1;
- }
- int ClearList(LinkList *L)//整表删除
- {
- LinkList p,q;
- p=(*L)->next;//P指向第一个结点
- while(p)
- {
- q=p->next;
- free(p);
- p=q;
- }
- (*L)->next=NULL;//头结点指针域为空
- return 1;
- }
- int GetElem(LinkList L,int i,ElemType *e)
- {
- int j=1;
- LinkList p;
- p=L->next;
- while(p&&j<i)
- {
- p=p->next;
- j++;
- }
- if(!p||j>i) //if(!p||j>=i)
- {
- return 0;
- }
- *e=p->data;
- return 1;
- }
- int ListTraverse(LinkList L)
- {
- LinkList p=L->next;
- while(p)
- {
- printf("%3d",p->data);
- p=p->next;
- }
- printf("\n");
- return 1;
- }
- int ListInsert(LinkList *L,int i,ElemType e)
- {
- LinkList p,s;
- p=*L;
- int j=1;
- while(p&&j<i)
- {
- p=p->next;
- j++;
- }
- if(!p&&j>i)
- {
- return 0;
- }
- else
- s=(LinkList)malloc(sizeof(Node));
- s->data=e;
- s->next=p->next;
- p->next=s;
- return 1;
- }
- int ListDelete(LinkList *L,int i,ElemType *e)
- {
- int j=1;
- LinkList p,q;
- p=*L;
- while(p->next&&j<i)
- {
- p=p->next;
- j++;
- }
- if(!(p->next)||j>i)
- return 0;
- q=p->next;
- p->next=q->next;
- *e=q->data;
- free(q);
- return 1;
- }
- int main()
- {
- LinkList L;
- ElemType e,f;
- int i,j,k,m;
- i=InitList(&L);
- printf("初始化后长度为:L.length=%d\n",ListLength(L));
- for(j=1;j<=5;j++)
- {
- i=ListInsert(&L,1,j);
- }
- printf("在表头插入1到5之后:L.data=");
- ListTraverse(L);
- printf("表长:ListLength=%d\n",ListLength(L));
- i=ListEmpty(L);
- printf("表是否为空:i=%d(1代表是,0代表否)\n",i);
- i=ClearList(&L);
- printf("清空表后表长:ListLength=%d\n",ListLength(L));
- i=ListEmpty(L);
- printf("表是否为空:i=%d(1代表是,0代表否)\n",i);
- for(j=1;j<=5;j++)
- {
- i=ListInsert(&L,j,j);
- }
- printf("表尾插入1到5之后:L.data=");
- ListTraverse(L);
- i=ListLength(L);
- printf("你想查找第几个元素?");
- scanf("%d",&k);
- if(k>0&&k<=i)
- {
- GetElem(L,k,&e);
- printf("第%d个元素的值是%d\n",k,e);
- }
- else
- printf("查找元素不存在\n");
- j=ListLength(L);
- printf("你想删除第几个数字?");
- scanf("%d",&m);
- if(m>0&&m<=j)
- {
- ListDelete(&L, m,&f);
- printf("删除成功,删除的数字是%d\n",f);
- printf("删除后表为:");
- ListTraverse(L);
- }
- else
- printf("不存在此元素\n");
- return 0;
- }