单链表上的基本操作
单链表的定义
单链表中结点类型的描述如下:
| typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList;
|
单链表上基本操作的实现
1.采用头插法建立单链表
| LinkList List_HeadInsert(LinkList &L){ 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; }
|
2.采用尾插法建立单链表
| LinkList List_TailInsert(LinkList &L){ int x; L=(LinkList)malloc(sizeof(LNode)); LNode *s,*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; }
|
3.按序号查找结点值
| LNode *GetElem(LinkList L,int i){ int j=1; LNode *p = L->next; if(i==0) return L; if(i<1) return NULL; while(p&&j<i) { p=p->next; j++; } return p; }
|
4.按值查找表结点
| LNode *LocateElem(LinkList L,ElemType e){ LNode *p = L->next; while(p!=NULL&&p->data!=e) { p=p->next; } return p; }
|
5.插入结点操作
| void Insert(LinkList &L,int i,int x){ LNode *p; LNode *s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=NULL; p=GetElem(L,i-1); if(p!=NULL){ s->next =p->next; p->next=s; }else{ cout<<"插入值非法"<<endl; return ; } }
|
对某一结点进行前插操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void Delect(LinkList &L,int i){ LNode *p; LNode *q=(LNode*)malloc(sizeof(LNode)); p=GetElem(L,i-1); if(p==NULL||p->next==NULL) { cout<<"删除值非法"<<endl; free(q); return ; } q=p->next; p->next=q->next; free(q); }
|
6.删除结点操作
| p=GetElem(L,i-1) q=p->next; p->next=q->next; free(q);
|
拓展:删除结点*p
| q=p->next; p->data = p->next->data p->next = q->next; free(q);
|
单链表上基本操作的完整实现
程序源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| #include<bits/stdc++.h> using namespace std; typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; LinkList List_HeadInsert(LinkList &L){ 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; } LNode *GetElem(LinkList L,int i){ int j=1; LNode *p = L->next; if(i==0) return L; if(i<1) return NULL; while(p&&j<i) { p=p->next; j++; } return p; } LNode *LocateElem(LinkList L,ElemType e){ LNode *p = L->next; while(p!=NULL&&p->data!=e) { p=p->next; } return p; } void PrintLinkList(LinkList L){ LNode *tmp = L->next; if(tmp==NULL) { cout<<"链表为空"<<endl; return ; } while(tmp!=NULL){ cout<<tmp->data<<" "; tmp=tmp->next; } cout<<endl; } void Insert(LinkList &L,int i,int x){ LNode *p; LNode *s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=NULL; p=GetElem(L,i-1); if(p!=NULL){ s->next =p->next; p->next=s; }else{ cout<<"插入值非法"<<endl; return ; } }
void Delect(LinkList &L,int i){ LNode *p; LNode *q=(LNode*)malloc(sizeof(LNode)); p=GetElem(L,i-1); if(p==NULL||p->next==NULL) { cout<<"删除值非法"<<endl; free(q); return ; } q=p->next; p->next=q->next; free(q); } int main(){ LinkList L; List_HeadInsert(L); PrintLinkList(L); LNode *tmp; tmp=GetElem(L,2); if(tmp!=NULL){ cout<<"位置为2的元素是:"<<tmp->data<<endl; }else{ cout<<"非法的位置"<<endl; } tmp=LocateElem(L,1); if(tmp!=NULL){ cout<<"存在值为1的元素:"<<tmp->data<<endl; }else{ cout<<"没有找到该值"<<endl; } PrintLinkList(L); Insert(L,5,110); PrintLinkList(L); Delect(L,2); PrintLinkList(L); return 0; }
|
程序输出
| 4 3 2 1 位置为2的元素是:3 存在值为1的元素:1 4 3 2 1 4 3 2 1 110 4 2 1 110
|