《數據結構》_2線性表
阿新 • • 發佈:2018-06-02
重復 max first 後繼 turn 循環 序列 次數 error
線性表定義
- 線性表是零個或多個數據元素構成的線性序列,是最基礎、最常用的一種線性數據結構。
線性表的順序存儲結構和實現
線性表的順式存儲.c
#include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define Overflow 2//上溢 #define Underflow 3//下溢 #define NotPresent 4//元素不存在 #define Duplicate 5//有重復元素 typedef int EleType; typedef struct//線性表的順序表示 { int n;//順序表中數據元素的個數int maxLength;//順序表最大允許長度 ElemType *element;//自定義類型 }SeqList; typedef int Status; Status Init(SeqList *L,int mSize)//initialize { L->maxLength=mSize; L->n=0; L->element=malloc(sizeof(ElemType)*msize);//動態生成一維空間 if(!L->element) return ERROR; return OK; } Status Find(SeqList L,inti,ElemType *x)//查找 { if(i<0||i>L.n-1) //此處體現了算法的健壯性 return ERROR;//判斷i是否越界 *x=L.element[i];//取出elment[i]的值 return OK; } Status Insert(SeqList *L,int i,ElemType x) { int j; if(i<-1||i>L->n-1)//判斷下標是否越界 retyrn ERROR; if(L->n==L->maxLength)//判斷順序表是否已經滿了 return ERROR; for(j=L->n-1;j>1;j--) L->element[j+1]=L->element[j];//從後往前移動元素 L->element[i+1]=x;//將新元素放入下標為i+1的位置 L->n=L->n+1; return OK; } /*
插入操作的平均次數為E=∑(n-i-1)/(n+1)=n/2,算法復雜度為O(n)
*/
Status Delete(SeqList *L,int i) { int j; if(i<0||i>L->n-1)//判斷下標是否越界 retyrn ERROR; if(!L->n)//判斷順序表是否為空 return ERROR; for(j=i+1;j<L->n;j++) L->element[j+1]=L->element[j];//從前往後逐個前移 L->n=L->n-1; return OK; }
/*
刪除操作的平均次數為E=∑(n-i-1)/(n)=(n-1)/2,算法復雜度為O(n)
*/
Status Output(SeqList L)//輸出 { int j; if(!L.n)//判斷順序表是否為空 return ERROR; for(j=0;j<=L.n-1;j++) printf("%d ",L.element[i]); return OK; } Status Destroy(SeqList *L)//撤銷 { (*L).n=0; (*L).maxLength=0; free((*L).element); } void main(){ int i; SeqList list; Init(&list,10); for(i=0;i<9;i++) Insert(&list,i-1,i); Output(list); Delete(&list,0); Output(list); Destroy(&list); }
線性表的鏈式存儲結構和實現
采用鏈式存儲結構的線性表稱為鏈表。鏈表有單鏈表、循環鏈表、雙向鏈表等多種類型。
線性表的鏈式存儲.c
#include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define Overflow 2//上溢 #define Underflow 3//下溢 #define NotPresent 4//元素不存在 #define Duplicate 5//有重復元素 typedef int ElemType; typedef int Status; typedef struct Node { ElemType element;//結點的數據域 struct Node *link;//結點的指針域 }Node; typedef struct { int n;//數據元素的個數 struct Node *first;//頭指針 }SingleList; Status Init(SingleList *L)//initialize { L->first=NULL; L->n=0; return OK; } Status Find(SingleList L,int i,ElemType *x)//查找 { Node *p; int j; if(i<0||i>L.n-1) return ERROR;//判斷i是否越界 p=L.first; for(j=0;j<i;j++)p=p->link;//從頭結點開始查找a *x=p->element;//取出ai的值 return OK; } Status Insert(SingleList *L,int i,ElemType x) { Node *p,*q; int j; if(i<-1||i>L->n-1)//判斷下標是否越界 return ERROR; p=L->first; for(j=0;j<i;j++)p=p->link; q=malloc(sizeof(Node));//生成新結點 q->element=x; if(i>-1) { q->link=p->link;//新結點插在p結點之後 p->link=q; } else { q->link=L->first;//插在頭結點之前,成為新頭結點 L->first=q; } L->n=L->n+1; return OK; } Status Delete(SingleList *L,int i) { Node *p,*q; int j; if(!L->n)return ERROR; if(i<-1||i>L->n-1)//判斷下標是否越界 return ERROR; p=L->first; q=L->first; for(j=0;j<i;j++)q=q->link; if(i==0) L->first=L->first->link;//Delete head else{ p=q->link; q->link=p->link; } free(p); L->n=L->n-1; return OK; } Status Output(SingleList L)//輸出 { Node *p; if(!L.n)//判斷順序表是否為空 return ERROR; p=L.first; while(p) { printf("%d ",p->element); p=p->link; } printf("\n"); return OK; } Status Destroy(SingleList *L)//撤銷 { Node *p; while (L->first) { p=L->first->link;//保存後繼地址防止斷鏈 free(L->first);//釋放 L->first=p; } return OK; } void main(){ int i; int x; SingleList list; Init(&list); for(i=0;i<9;i++) Insert(&list,i-1,i); Output(list); // Delete(&list,0); //Output(list); Find(list,6,&x); printf("%d ",x); Destroy(&list); }
單鏈表的逆置.c
#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef int Status; typedef struct Node { ElemType element;//結點的數據域 struct Node *link;//結點的指針域 }Node; typedef struct { int n;//數據元素的個數 struct Node *first;//頭指針 }SingleList; Node *CreatList(void) { int val, i, n; Node *head, *p, *q; head = NULL; printf("請輸入元素個數:\n"); scanf("%d", &n); printf("請輸入%d個元素:\n",n); for(i=0; i<n; ++i) { scanf("%d", &val); p = (Node *)malloc(sizeof(Node)); p->element = val; if(head==NULL) q=head =p; else q->link = p; q = p; } p->link = NULL; return head; } //鏈表的逆置 Node *ReverseList(Node *head) { Node *p,*q,*r; p=head; q=r=NULL; while(p) { q = p->link; p->link = r; r = p; p = q; } return r; } //輸出鏈表 void Output(Node *head) { Node *p; p=head; while(p) { printf("%d ",p->element); p=p->link; } printf("\n"); } int main(void) { Node *head; head = CreatList(); printf("鏈表逆置前的數據:\n"); Output(head); head = ReverseList(head); printf("鏈表逆置後的數據:\n"); Output(head); return 0; }
《數據結構》_2線性表