1. 程式人生 > >數據結構與算法之鏈表

數據結構與算法之鏈表

分用 nod alloc ++ show 前驅 增加 創建 mda

1. 鏈表

  • 線性表的鏈式存儲結構就是用一組任意的存儲單元(可以是不連續的)存儲線性表的數據元素。
  • 采用鏈式存儲結構的表示的線性表簡稱鏈表。
  • 鏈式存儲方式可用於表示線性結構,也可用於表示非線性結構。

鏈表通常有兩個域

  • data域——存放結點值的數據域
  • next域——存放結點的直接後繼的地址,需要指針類型表示

技術分享圖片

2.單鏈表的表示方式

技術分享圖片

技術分享圖片

3.鏈表的存儲結構

  • 由於線性表中各元素間存在著線性關系,每一個元素有一個直接前驅和一個直接後繼。
  • 用鏈式存儲結構表示線性表中的一個元素時至少需要兩部分信息,一部分用於存放數據元素值,稱為數據域;另一部分用於存放直接前驅或直接後繼結點的地址(指針),稱為指針域,稱這種存儲單元為結點。

4.鏈表的分類

  • 單鏈表:只設置一個指向後繼結點地址的指針域;
  • 循環鏈表:鏈表首尾相接構成一個環狀結構;
  • 雙向鏈表:單鏈表中增加一個指向前驅的指針。

5.單鏈表的基本運算與實現示例

技術分享圖片
#include"stdio.h"
#include"malloc.h"

typedef struct
{
    int no;
    int score;
}DataType;

typedef struct node
{
    DataType data;
    struct node *next;
}ListNode;

//線性表的創建 //頭插法 ListNode * CreatList() { ListNode *L,*q; DataType x; //x為dataType類型的結構體變量 L=(ListNode *)malloc(sizeof(ListNode)); //頭結點 L->next=NULL; printf("請輸入學號和成績,以學號-1為結束:\n"); scanf("%d",&x.no); while(x.no!=-1) { scanf("%d",&x.score); q
=(ListNode *)malloc(sizeof(ListNode)); q->data=x; q->next=L->next; //頭結點所存地址保存於新建結點的指針域中// L->next=q; //新建結點的地址保存於頭結點的指針域中 scanf("%d",&x.no); } return L; } //初始化 ListNode * InitList() { ListNode *L; L=(ListNode*)malloc(sizeof(ListNode)); L->next=NULL; return L; } void PrintList(ListNode * L) { ListNode *p; p=L->next; while(p!=NULL) { printf("[%d,%d]\n",p->data.no,p->data.score); p=p->next; } printf("\n"); } int GetLength(ListNode *L) { int num=0; ListNode *p; p=L->next; while(p!=NULL) { num++; p=p->next; } return(num); } void InsertList(ListNode *L,int i,DataType x) { ListNode *p,*q,*s; int j=1; p=L; if(i<1||i>GetLength(L)+1) printf("error!\n"); s=(ListNode *)malloc(sizeof(ListNode)); s->data=x; while(j<=i) { q=p; p=p->next; j++; } /*找到插入位置*/ s->next=q->next;//=p q->next=s; } //按序號取元素 ListNode *GetNode(ListNode *L,int i) { ListNode *p; int j=1; if(i<1 || i>GetLength(L)) { printf("error!\n"); } p=L->next; while(p!=NULL&&j<i) { p=p->next; j++; } return p; } //查找運算 int LocateList(ListNode *L,DataType x) { int k=1; ListNode *p; p=L->next; while(p&&p->data.no!=x.no) { p=p->next; k++; } if(p==NULL) return 0; else return k; } //修改第i個元素 void EditList(ListNode *p,int i,DataType e) { int k=1; if(i<1 ||i>GetLength(p)) { printf("position error\n"); } while(k<=i) { p=p->next; k++; } p->data=e; } void DeleteList(ListNode *L,int i) { ListNode *p,*q; int j=1; p=L; if(i<1 || i>GetLength(L)) { printf("error!\n"); } while(j<i) { p=p->next; j++; } q=p->next; p->next=q->next; free(q); } //排序 void SortList(ListNode *L) { ListNode *p,*q,*pmin; DataType e; for(p=L->next;p->next!=NULL;p=p->next) //選擇排序 { pmin=p; for(q=p->next;q!=NULL;q=q->next) if(q->data.score>pmin->data.score) pmin=q; if(pmin!=p) { e=p->data; p->data=pmin->data; pmin->data=e; } } } void main() { ListNode *head,*p; DataType e; // head=InitList(); //創建 head=CreatList(); PrintList(head); printf("The length of linklist is %d\n",GetLength(head)); //插入 e.no=9; e.score=80; InsertList(head,GetLength(head)+1,e); printf("插入後:\n"); PrintList(head); printf("The length of linklist is %d\n",GetLength(head)); //查詢 e.no=3; int k=LocateList(head,e); p=GetNode(head,k); if(k>0) printf("學號為3的記錄:[%d %d]\n",p->data.no,p->data.score); else printf("不存在的\n"); //修改 e.no=3; e.score=100; int m=LocateList(head,e); EditList(head,m,e); printf("修改後:\n"); PrintList(head); //刪除 e.no=2; int n=LocateList(head,e); DeleteList(head,n); printf("刪除學號為2的記錄後:\n"); PrintList(head); printf("The length of linklist is %d\n",GetLength(head)); //排序 printf("排序後:\n"); SortList(head); PrintList(head); }
View Code

數據結構與算法之鏈表