1.单链表定义
//单链表结点类型描述 typedef struct LNode{ int data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList;
2.单链表基本操作实现
2.1 头插法建立单链表(逆序)
//头插法建立单链表 LinkList List_HeadInsert(LinkList &L,int n) { LNode *s; int x; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(int i=0;i<n;i++) { cin>>x; s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=L->next; L->next=s; } return L; }
2.2 尾插法建立单链表(顺序)
//尾插法建立单链表 LinkList List_TailInsert(LinkList &L,int n) { int x; L=(LinkList)malloc(sizeof(LNode)); LNode *s,*r=L; for(int i=0;i<n;i++) { cin>>x; s=(LNode*)malloc(sizeof(LNode)); s->data=x; r->next=s; r=s; } r->next=NULL; return L; }
2.3 按序号查找结点值
//按序号查找单链表L(带头结点)中第i个位置结点指针 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; }
2.4 按值查找表结点
//按值查找表结点 LNode *LocateElem(LinkList L,int e) { LNode *p=L->next; while(p!=NULL&&p->data!=e) p=p->next; return p; }
2.5 插入结点操作
//插入结点操作 /*调用GetElem(L,i-1),查找第i-1个结点,再在其后插入新结点*/ LinkList InsertNode(LinkList &L,int i) { LNode *p,*s; s=(LNode*)malloc(sizeof(LNode)); s->data=100; p=GetElem(L,i-1); s->next=p->next; p->next=s; return L; // //将*s结点插入到*p结点之前的主要代码 // int temp=0; // s->next=p->next; // p->next=s; // temp=p->data; // p->data=s->data; // s->data=temp; }
2.6 删除结点操作
//删除结点操作 LinkList DeleteNode(LinkList &L,int i) { //结点*p为找到的被删除结点的前驱结点 LNode *p,*q; p=GetElem(L,i-1); q=p->next; p->next=q->next; free(q); return L; //删除结点*p //法一:先找到*p的前驱结点,再执行删除操作,时间复杂度为O(n) //法二:将*p后继结点值赋予自身,再删除后继结点,时间复杂度为O(1) // q=p->next; // p->data=q->data; // p->next=q->next; // free(q); }
3.运行代码
#include <iostream> using namespace std; int arr[100]; //单链表结点类型描述 typedef struct LNode{ int data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; //头插法建立单链表 LinkList List_HeadInsert(LinkList &L,int n) { LNode *s; int x; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(int i=0;i<n;i++) { cin>>x; s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=L->next; L->next=s; } return L; } //尾插法建立单链表 LinkList List_TailInsert(LinkList &L,int n) { int x; L=(LinkList)malloc(sizeof(LNode)); LNode *s,*r=L; for(int i=0;i<n;i++) { cin>>x; s=(LNode*)malloc(sizeof(LNode)); s->data=x; r->next=s; r=s; } r->next=NULL; return L; } //List_HeadInsert函数+outPutValue函数可实现头插法建立单链表以及逆序输出结点数据值 /* 10 12 23 18 90 32 17 67 45 89 13 13 89 45 67 17 32 90 18 23 12 */ void outPutValue(LinkList L) { LNode *s=L->next; while(s!=NULL) { cout<<s->data<<" "; s=s->next; } cout<<endl; } //按序号查找单链表L(带头结点)中第i个位置结点指针 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,int e) { LNode *p=L->next; while(p!=NULL&&p->data!=e) p=p->next; return p; } //插入结点操作 /*调用GetElem(L,i-1),查找第i-1个结点,再在其后插入新结点*/ LinkList InsertNode(LinkList &L,int i) { LNode *p,*s; s=(LNode*)malloc(sizeof(LNode)); s->data=100; p=GetElem(L,i-1); s->next=p->next; p->next=s; return L; // //将*s结点插入到*p结点之前的主要代码 // int temp=0; // s->next=p->next; // p->next=s; // temp=p->data; // p->data=s->data; // s->data=temp; } //删除结点操作 LinkList DeleteNode(LinkList &L,int i) { //结点*p为找到的被删除结点的前驱结点 LNode *p,*q; p=GetElem(L,i-1); q=p->next; p->next=q->next; free(q); return L; //删除结点*p //法一:先找到*p的前驱结点,再执行删除操作,时间复杂度为O(n) //法二:将*p后继结点值赋予自身,再删除后继结点,时间复杂度为O(1) // q=p->next; // p->data=q->data; // p->next=q->next; // free(q); } int main() { int n; LinkList L; LNode *s,*t; cin>>n; // List_HeadInsert(L,n); List_TailInsert(L,n); outPutValue(L); // s=GetElem(L,3); // cout<<s->data; // t=LocateElem(L,2); InsertNode(L,3); outPutValue(L); DeleteNode(L,3); outPutValue(L); return 0; } /* 5 23 12 56 78 90 23 12 56 78 90 23 12 100 56 78 90 23 12 56 78 90 */