1. 程式人生 > >考研數據結構-單鏈表(基本操作)

考研數據結構-單鏈表(基本操作)

數據結構 scan dlink code 尾插 default 基本操作 length nbsp

這次和以往不同,我們先放出全部代碼,之後再慢慢分析。

#include<stdio.h>
#include<malloc.h>
#define ElemType int



typedef struct LNode{
    struct LNode *next;
    ElemType data;
}LNode,*LinkList;


LinkList  CreateLinkListH1(LinkList &L){
//頭插法 ,data域來源於鍵盤輸入 
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof
(LNode)); L->next=NULL; scanf("%d",&x); while(x!=9999){ s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=L->next; L->next=s; scanf("%d",&x); } return L; } LinkList CreateLinkListH2(LinkList &L,int a[],int n){
//頭插法 ,data域來源於數組 LNode *s; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(int i=0;i<n;i++){ s=(LNode*)malloc(sizeof(LNode)); s->data=a[i]; s->next=L->next; L->next=s; } return L; } LinkList CreateLinkListR1(LinkList &L){
//尾插法 ,data域來源於鍵盤輸入 LNode *s,*r; int x; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; r=L; scanf("%d",&x); while(x!=9999){ s=(LNode*)malloc(sizeof(LNode)); s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL; return L; } LinkList CreateLinkListR2(LinkList &L,int a[],int n){ //尾插法 ,data域來源於數組 LNode *s,*r; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; r=L; for(int i=0;i<n;i++){ s=(LNode*)malloc(sizeof(LNode)); s->data=a[i]; r->next=s; r=s; } r->next=NULL; return L; } void LoadLinkList(LinkList L){ LNode *p; p=L->next; if(p==NULL)printf("當前鏈表為空"); printf("當前鏈表元素有:") ; while(p!=NULL){ printf("%d ",p->data); p=p->next; } printf("\n"); } LNode *GetElem(LinkList L,int i){ //按序號查找第i個結點值 int j=1; LNode *p; p=L->next; if(i==0)return L; //若i==0,則返回頭結點 if(i<1)return NULL; //若i無效, 則返回NULL while(j<i&&p){ p=p->next; j++; } return p; //返回第i個節點的指針,如果i>表長,p==NULL,也是直接返回p即可。 } LNode *LocateElem(LinkList L,int x){ //按值查找表結點 LNode *p; p=L->next; while(p!=NULL&&p->data!=x){ p=p->next; } return p; } void LinkListInsertR1(LinkList &L,int i,ElemType e){ //後插操作 ,在給定位置之後插入 LNode *p; p=GetElem(L,i); //本算法主要的時間開銷在於查找第i-1個元素,時間復雜度為O(n) LNode *s; s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; } void LinkListInsertR2(LinkList &L,LNode *p,ElemType e){ //在給定結點之後插入,時間復雜度僅為O(1) LNode *s; s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; } void LinkListInsertH1(LinkList &L,int i,ElemType e){ //前插用後插實現 ,在給定位置之前插入 LNode *p; p=GetElem(L,i-1); //本算法主要的時間開銷在於查找第i-1個元素,時間復雜度為O(n) LNode *s; s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; } void LinkListInsertH2(LinkList &L,LNode *p,ElemType e){ //前插用後插操作實現,在給定結點之前插入,時間復雜度僅為O(1) LNode *s; ElemType temp; s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; temp=s->data; s->data=p->data; p->data=temp; } void LinkListDelete1(LinkList &L,int i,ElemType &e){ //刪除指定位置的結點 LNode *p; p=GetElem(L,i-1); LNode *q=p->next; e=q->data; p->next=q->next; free(q); } void LinkListDelete2(LinkList &L,LNode *p,ElemType &e){ //刪除指定結點p 可以通過刪除p的後繼結點實現,就是先將p的後繼節點的值賦給自身,然後刪除p的後繼節點 ElemType temp; e=p->data; LNode *q; q=p->next; p->data=q->data; p->next=q->next; free(q); } int GetLength(LinkList L){ int len=0; LNode *p=L->next; if(p==NULL)return 0; while(p){ len++; p=p->next; } return len; } int main(){ LinkList L1,L2; int a,i,x; LNode *p,*q; // int array[10]={3,4,6,8,44,2,4,5,6,66}; // printf("頭插法建立鏈表L1\n"); //CreateLinkListH // CreateLinkListH1(L1); // LoadLinkList(L1); // CreateLinkListH2(L1,array,10); // LoadLinkList(L1); // CreateLinkListR2(L1,array,10); // LoadLinkList(L1); printf("尾插法建立鏈表L2\n"); //CreateLinkListR CreateLinkListR1(L2); LoadLinkList(L2); while(1){ printf("1:計算表長\n"); //GetLength printf("2:指定結點的元素值\n"); //GetElem printf("3:按結點位置插入結點\n"); printf("4:按結點元素插入結點\n"); printf("5:按結點位置刪除結點\n"); printf("6:按結點元素刪除結點\n"); scanf("%d",&a); switch(a){ case 1: printf("L1表長為:%d\n",GetLength(L1)); printf("L2表長為:%d\n",GetLength(L2)); break; case 2: printf("請輸入結點位置:"); scanf("%d",&i); p=GetElem(L2,i); printf("%d\n",p->data); break; case 3: printf("[前插]請輸入插入結點位置及元素值"); scanf("%d %d",&i,&x); LinkListInsertH1(L2,i,x); LoadLinkList(L2); printf("[後插]請輸入插入結點位置及元素值"); scanf("%d %d",&i,&x); LinkListInsertR1(L2,i,x); LoadLinkList(L2); break; case 4: printf("[前插]請輸入要在哪個元素前插入什麽元素值"); scanf("%d %d",&i,&x); q=LocateElem(L2,i); LinkListInsertH2(L2,q,x); LoadLinkList(L2); printf("[後插]請輸入要在哪個元素後插入什麽元素值"); scanf("%d %d",&i,&x); q=LocateElem(L2,i); LinkListInsertR2(L2,q,x); LoadLinkList(L2); break; case 5: printf("請輸入刪除結點位置"); scanf("%d",&i); LinkListDelete1(L2,i,x); LoadLinkList(L2); break; case 6: printf("請輸入要刪除的元素值"); scanf("%d",&i); q=LocateElem(L2,i); LinkListDelete2(L2,q,x); LoadLinkList(L2); break; default:return 1; } } }

考研數據結構-單鏈表(基本操作)