一、线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任意元素,时间复杂度为1。然而,在做插入和删除操作时,需大量移动元素。
链式存储结构,它不要求逻辑上相邻的元素在物理位置上也相邻,插入和删除操作时,只需修改结点的下一个元素指针,但查找元素时效率不如顺序存储。
1.链式存储的结点
#define OK 1 #define ERROR 0 typedef bool Status; typedef int elemType; typedef struct LNode{ struct LNode *next; //指向下一个元素的指针 elemType data; //结点的值 }LNode,*LinkList;
2.创建单链表
a.头插法:每次将新的结点插入到第一个,所以链表的结点位置与输入的位置相反。
b.尾插法:每次将新的结点插入到最后一个,所以链表的结点位置与输入的位置相同。
//头插 建立链表L 长度为n Status createList(LinkList &L,int n){ L = (LinkList)malloc(sizeof(LNode)); L->next=NULL; for(int i=n;i>0;i--){ LNode *node = (LNode*)malloc(sizeof(LNode)); if(!node) return ERROR;//分配内存失败 printf("输入第%d个节点的值: ",i); scanf("%d",&node->data); node->next=L->next; L->next=node; } return OK; } //尾插 Status createList2(LinkList &L,int n){ L = (LinkList)malloc(sizeof(LNode)); L->next=NULL; LNode *last = L; //最后一个节点 for(int i=0;i<n;i++){ LNode *node = (LNode*)malloc(sizeof(LNode)); if(!node) return ERROR; printf("输入第%d个节点: ",i+1); scanf("%d",&node->data); node->next=NULL; last->next=node; last = node; } return OK; }
3.查找
//得到单链表中的第i个元素e Status getElem(LinkList &L,int i,elemType &e){ LNode *t = L; for(int j=0;j<i;j++){ if(t==NULL) return ERROR; t=t->next; } e = t->data; return OK; }
4.插入
//在单链表中插入元素e到位置i Status insert(LinkList &L,int index,int e){ LNode *t = L; //指向要插入位置的前一个结点 for(int i=0;i<index-1;i++){ if(!t)return ERROR; t=t->next; } LNode *node = (LNode*)malloc(sizeof(LNode)); if(!node)return ERROR; node->data=e; node->next=t->next; t->next=node; return OK; }
5.删除
//删除链表中的第index个节点 返回删除的结点 LNode* del(LinkList &L,int index){ LNode *t=L; //指向要删除结点的前一个 for(int i=0;i<index-1;i++){ if(!t)return NULL; t=t->next; } LNode *e = t->next; t->next=t->next->next; return e; }
6.打印单链表
//打印链表 void print(LinkList &L){ LNode *t = L->next; while(t){ printf("%d ",t->data); t=t->next; } printf("\n"); }