線性表之鏈表2019-11-17

線性表的鏈式存儲表示的特色是用一組任意的存儲單元存儲線性表數據元素
(這組存儲單元能夠是連續的,也能夠是不連續的)。
所以,爲了表示每一個數據元素 與其直接後繼數據元素 之間的邏輯關係,
對數據元素 來講,除了存儲其自己的信息以外,
還需存儲一個指示其直接後繼的信息(即直接後繼的存儲位置)。
由這兩部分信息組成一個"結點"(如概述旁的圖所示),表示線性表中一個數據元素

對於非線性的鏈表,能夠參見相關的其餘數據結構
例如樹、圖。另外有一種基於多個線性鏈表的數據結構
跳錶,插入、刪除和查找等基本操做的速度能夠達到O(nlogn),和平衡二叉樹同樣。
其中存儲 數據元素信息的域稱做數據域(設域名爲data),存儲直接後繼存儲位置的域稱爲 指針域(設域名爲next)。 指針域中存儲的信息又稱作指針或鏈。
由分別表示,,…,的N 個結點依次相鏈構成的鏈表,稱爲 線性表的鏈式存儲表示,因爲此類鏈表的每一個結點中只包含一個指針域,故又稱 單鏈表或線性鏈表。
如下代碼實現過程:(頭不爲空)
#include<stdio.h>
#include<stdlib.h>
struct node
{ 
    int data;
    struct node *next;  //後繼指針
};
int Length(struct node *head)//求表的長度
{
    struct node *t=NULL;
    t=head;
    int n=0;
    while(t!=NULL)
    {
        t=t->next;
        n++;
    }
    return n;
}
int  search1(struct node *head,int index)//根據序號查找返回值
{
   struct node *t=NULL;
   t=head;
   int j=1;
   while(t!=NULL&&j<index)
   {
       t=t->next;
       j++;
   }
   if(index==j)
   return t->data;
   else
    return 0;
}
 int search2(struct node *head,int x) //按值查找返回位置
 {
    struct node *t=NULL;
    t=head;
    int j=1;
    while(t!=NULL&&t->data!=x)
    {
        t=t->next;
        j++;
    }
    if(t->data==x)
    return j;
    else
    return 0;
 }
 void Delete(struct node *head,int index) //刪除鏈表中某個位置的
 {
    struct node *t=NULL,*q=NULL;
    t=head;
    int j=1;
    while(t!=NULL&&j<index-1)
    {
       t=t->next;
       j++;
    }
    q=t->next;
    t->next=q->next;
    free(t);
    t=head;
    while(t!=NULL)
    {
        printf("%d ",t->data);
        t=t->next;
    }
        
 }
 void AllDelete(struct node *head)  //整個表的刪除
 {
     struct node *t=NULL,*q=NULL;
     t=head;
     while(t!=NULL)
     {
         q=t->next;
         free(t);
         t=q;
     }
     head=NULL;

 }
int main()
{
   struct  node *head=NULL,*p,*q=NULL,*t=NULL;  //初始化爲空
   int n,i,a;
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
        scanf("%d",&a);
        p=(struct node *)malloc(sizeof(struct node)); //分配動態空間
        p->data=a;
        p->next=NULL;
        if(head==NULL)
            head=p;
        else
            q->next=p;  //q做爲臨時保存
        q=p;
   }
   printf("表的長度:%d\n",Length(head));  
   printf("位置1的值:%d\n",search1(head,1));
   printf("值爲4的位置%d\n",search2(head,4));
   Delete(head,3);//刪除位置爲3的節點
    scanf("%d",&a);    //插入
    t=head;
    while(t!=NULL)
    {
        if(t->next->data>a)  //找到位置
        {
            p=(struct node *)malloc(sizeof(struct node));
            p->data=a;
            p->next=t->next;  //後接
            t->next=p;     //前接
            break;
        }
        t=t->next;
    }
     //輸出
    t=head;
    while(t!=NULL)
    {
        printf("%d ",t->data);
        t=t->next;
    }
    AllDelete(head); //刪除整個表

}
相關文章
相關標籤/搜索