程式設計實現順序儲存結構和鏈式儲存結構線性表的建立、查詢、插入、刪除等基本操作
阿新 • • 發佈:2019-02-06
#include <stdio.h> #include <stdlib.h> typedef struct LNode{ int data; //連結串列資料 struct LNode* next; //連結串列指標 }LNode,*LinkList; typedef enum __bool { false = 0, true = 1, } bool; /*頭插法-建立單鏈表*/ LinkList HeadCreate(LinkList la) { int num; la=(LinkList)malloc(sizeof(LNode)); //建立頭結點 la->next=NULL; scanf("%d",&num); while(num!=10) { LNode *p=(LinkList)malloc(sizeof(LNode)); p->data=num; p->next=la->next; la->next=p; scanf("%d",&num); } return la; } /*尾插法-建立單鏈表*/ LinkList TailCreate(LinkList la) { int num; la=(LinkList)malloc(sizeof(LNode)); la->next=NULL; LinkList s,r=la; scanf("%d",&num); while(num!=10) { s=(LinkList)malloc(sizeof(LNode)); s->data=num; r->next=s; r=s; scanf("%d",num); } r->next=NULL; return la; } /*單鏈表遍歷*/ void TravelList(LinkList la) { LinkList p=la->next; while(p!=NULL) { printf("%d->",p->data); p=p->next; } printf("\n"); } /*單鏈表的按位查詢*/ LinkList GetElem(LinkList la,int i) { int j=1; LNode* p=la->next; if(i<1) return NULL; while(p && j<i) { p=p->next; j++; } return p; } /*單鏈表的按值查詢*/ LinkList LocalElem(LinkList la,int e) { LNode* p=la->next; while(p!=NULL && p->data!=e) p=p->next; return p; } /*單鏈表插入操作*/ bool InsertList(LinkList la,int i,int e) { //在la連結串列中的i位置插入數值e int j=1; LinkList p=la,s; while(p && j<i) { p=p->next; j++; } if(p==NULL) return false; if((s=(LinkList)malloc(sizeof(LNode)))==NULL) return false; s->data=e; s->next=p->next; p->next=s; return true; } /*單鏈表刪除操作*/ bool DeleteList(LinkList la,int i) { int j=1; LinkList p=la,q; while(p && j<i) //p指向第i-1個元素 { p=p->next; j++; } if(p==NULL || p->next==NULL) //表示不存在第i-1個和第i的元素 return false; q=p->next; p->next=q->next; free(q); return true; } /*單鏈表的表長*/ int LengthList(LinkList la) { int nLen=0; LinkList p=la->next; while(p) { p=p->next; nLen++; } return nLen; } /*單鏈表逆置*/ LinkList Reserve(LinkList la) { if(la==NULL || la->next==NULL) return la; LinkList p=la->next,q=p->next,r=q->next; la->next=NULL; p->next=NULL; while(r!=NULL) { q->next=p; p=q; q=r; r=r->next; } q->next=p; la->next=q; return la; } int main() { LNode la; LinkList p; p=HeadCreate(&la); //頭插法建立單鏈表 TravelList(p); printf("%p\n",GetElem(p,1)); //獲得第1個結點地址 InsertList(p,2,10); //在連結串列的第2個位置插入元素10 TravelList(p); DeleteList(p,3); //刪除連結串列的第3個元素 TravelList(p); printf("%d\n",LengthList(p)); //獲得連結串列長度 p=Reserve(p); TravelList(p); return 0; } //執行結果 //5 6 12 7 8 14 9 3 2 5 14 10 頭插法建立連結串列 //14->5->2->3->9->14->8->7->12->6->5-> 顯示連結串列 //00382490 第一個結點的地址 //14->10->5->2->3->9->14->8->7->12->6->5-> 插入元素值為10的結點 //14->10->2->3->9->14->8->7->12->6->5-> 刪除第三個結點 //11 獲得連結串列長度 //5->6->12->7->8->14->9->3->2->10->14-> 連結串列逆置 //Press any key to continue