1. 程式人生 > >《數據結構》_2線性表

《數據結構》_2線性表

重復 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,int
i,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線性表