赞
踩
目录
单链表是一种链式存储的线性表,它用一组地址任意的存储单元来存放线性表中的数据元素。每个节点包含两个部分:数据域和指针域。数据域用于存储数据元素,指针域则存储下一个节点的地址。单链表的第一个节点称为头结点,最后一个节点称为尾结点。
单链表是一种链式存取的数据结构,用一组地址任意的存储单元来存放线性表中的数据元素。
每个节点包含两个部分:数据域和指针域。数据域用于存储数据元素,指针域则存储下一个节点的地址。链表中的数据是以结点来表示的,每个结点的构成包括元素(数据元素的映像)和指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。链表中的每个结点在内存中不是按顺序排列的,而是通过指针链接在一起。单链表的第一个节点称为头结点,最后一个节点称为尾结点。
与顺序表相比,单链表的优点在于插入和删除操作方便,时间复杂度较低,但随机访问和空间利用率不如顺序表。在实际应用中,单链表通常作为其他数据结构的子结构,如哈希表的桶、图的邻接表等。
单链表定义了节点的基本结构,包括数据元素和指向下一个节点的指针。节点的插入和删除操作涉及指针的修改,而非直接修改节点内容。由于其非连续性的特性,链表无法像数组一样随机访问任意元素,而只能从头到尾依次访问。因此,对于需要频繁插入和删除元素的应用场景,单链表是一种高效的数据结构。
单链表的优点:
单链表的缺点:
- #define OK 1
- #define ERROR 0
-
- typedef char ElemType;
- typedef int Status;
- typedef struct LNode{
- ElemType data;
- struct LNode *next;
- }LNode,*LinkList;
- //单链表初始化
- Status InitList(LinkList &head){
- head=new LNode;
- head->next=NULL;
- return OK;
- }
- 创建一个新的结点。
- 将新结点的数据域置为所需插入的数据。
- 根据插入位置的不同,将新结点的指针域指向插入位置的后一个结点。如果是头部插入,则将新结点的指针域指向头结点;如果是尾部插入,则将新结点的指针域指向空;如果是中间插入,则将新结点的指针域指向插入位置的后一个结点。
- 将插入位置前一个结点的指针域修改为指向新结点。如果是头部插入,则将头结点的指针域修改为指向新结点;如果是尾部插入,则将尾结点的指针域修改为指向新结点;如果是中间插入,则将插入位置前一个结点的指针域修改为指向新结点。
- //插入
- Status ListInsert(LinkList &head,int i,ElemType e){
- LinkList p=head;
- int j=0;
- while (p && (j<i-1)){
- p=p->next;
- ++j;
- }
- if (!p||j>i-1){
- return ERROR;
- }
-
- LNode *s=new LNode;
- s->data=e;
- s->next=p->next;
- p->next=s;
-
- return OK;
- }
- //求单链表长度
- Status GetLinkListLength(LinkList head){
- LinkList p=head->next;
- int length=0;
- while (p){
- p=p->next;
- length++;
- }
- return length;
- }
-
- //清空
- Status ClearLinkList(LinkList &head){
- LinkList p = head->next;
- LinkList q;
- while(p){
- q = p;
- p = p->next;
- delete q;
- }
- head->next = NULL;
- return OK;
- }
-
- //销毁
- Status DestoryLinkList(LinkList &head){
- LinkList p;
- while(head){
- p = head;
- head = head->next;
- delete p;
- }
- return OK;
- }
- //取值
- Status GetLinkList(LinkList head,int i,ElemType &e){
- LinkList p = head->next;
- int j = 0;
- while (p && j<i){
- p=p->next;
- j++;
- }
- if (!p || j>i){
- return ERROR;
- }
- e=p->data;
-
- return OK;
- }
- //查找用函数返回查找元素的位置
- int LocateLinkListElem(LinkList head,ElemType e){
- LinkList p=head->next;
- int j=1;
- while (p && (p->data != e)){
- p=p->next;
- j++;
- }
- if(p==NULL){
- return 0;
- }
- return j;
- }
- 找到要删除的结点的前一个结点。
- 将前一个结点的指针域修改为指向要删除的结点的下一个结点。
- 释放要删除的结点的存储空间。
-
- //删除
- Status ListDelete(LinkList &head,int i,ElemType &e){
- LinkList p=head;
- int j=0;
- while ((p->next) && (j<i-1)){
- p=p->next;
- ++j;
- }
- if (!(p->next)||j>i-1){
- return ERROR;
- }
- LinkList q=p->next;
- e=q->data;
- p->next=q->next;
- delete q;
- return OK;
- }
- //头插法创建单链表
- void CreateList_H(LinkList &head,int n){
- head=new LNode;
- head->next=NULL;
- for(int i=0;i<n;++i){
- LNode *p=new LNode;
- ElemType cin='a';
- cin>>p->data;
- p->next=head->next;
- head->next=p;
- }
- }
- //尾插法创建单链表
- void CreateList_R(LinkList &head,int n){
- head=new LNode;
- head->next=NULL;
- LNode *r=head;
- for(int i=0;i<n;++i){
- LNode *p=new LNode;
- ElemType cin='a';
- cin>>p->data;
- p->next=NULL;
- r->next=p;
- r=p;
- }
- }
- #include <stdio.h>
-
- #define OK 1
- #define ERROR 0
-
- typedef char ElemType;
- typedef int Status;
-
- typedef struct LNode{
- ElemType data;
- struct LNode *next;
- }LNode,*LinkList;
-
- //单链表初始化
- Status InitList(LinkList &head){
- head=new LNode;
- head->next=NULL;
- return OK;
- }
-
- //功能菜单
- int choice() {
- printf("==================================\n");
- printf(" 单链表操作功能菜单 \n");
- printf("1、插入元素 2、查询表长 3、按位查找\n");
- printf("4、按值查找 5、删除元素 6、销毁链表\n");
- printf("7、清空链表 8、批量插入 9、结束程序\n");
- printf("10、头插法创建单链表11、尾插法创建单链表\n");
- printf("==================================\n");
- return 0;
- }
-
-
- //插入
- Status ListInsert(LinkList &head,int i,ElemType e){
- LinkList p=head;
- int j=0;
- while (p && (j<i-1)){
- p=p->next;
- ++j;
- }
- if (!p||j>i-1){
- return ERROR;
- }
-
- LNode *s=new LNode;
- s->data=e;
- s->next=p->next;
- p->next=s;
-
- return OK;
- }
-
- //求单链表长度
- Status GetLinkListLength(LinkList head){
- LinkList p=head->next;
- int length=0;
- while (p){
- p=p->next;
- length++;
- }
- return length;
- }
-
- //销毁
- Status DestoryLinkList(LinkList &head){
- LinkList p;
- while(head){
- p = head;
- head = head->next;
- delete p;
- }
- return OK;
- }
-
- //清空
- Status ClearLinkList(LinkList &head){
- LinkList p = head->next;
- LinkList q;
- while(p){
- q = p;
- p = p->next;
- delete q;
- }
- head->next = NULL;
- return OK;
- }
-
- //取值
- Status GetLinkList(LinkList head,int i,ElemType &e){
- LinkList p = head->next;
- int j = 0;
- while (p && j<i){
- p=p->next;
- j++;
- }
- if (!p || j>i){
- return ERROR;
- }
- e=p->data;
-
- return OK;
- }
-
-
- //查找用引用型参数返回查找元素的位置
- //LNode *LocateLinkList(LinkList head,ElemType e,Status &j){
- // LinkList p=head->next;
- // j=1;
- // while (p && p->data!=e){
- // p=p->next;
- // j++;
- // }
- // return p;
- //}
- //查找用函数返回查找元素的位置
- int LocateLinkListElem(LinkList head,ElemType e){
- LinkList p=head->next;
- int j=1;
- while (p && (p->data != e)){
- p=p->next;
- j++;
- }
- if(p==NULL){
- return 0;
- }
- return j;
- }
-
- //删除
- Status ListDelete(LinkList &head,int i,ElemType &e){
- LinkList p=head;
- int j=0;
- while ((p->next) && (j<i-1)){
- p=p->next;
- ++j;
- }
-
- if (!(p->next)||j>i-1){
- return ERROR;
- }
- LinkList q=p->next;
- e=q->data;
- p->next=q->next;
- delete q;
- return OK;
- }
-
- //头插法创建单链表
- void CreateList_H(LinkList &head,int n){
- head=new LNode;
- head->next=NULL;
- for(int i=0;i<n;++i){
- LNode *p=new LNode;
- ElemType cin='a';
- cin>>p->data;
- p->next=head->next;
- head->next=p;
- }
- }
-
-
- //尾插法创建单链表
- void CreateList_R(LinkList &head,int n){
- head=new LNode;
- head->next=NULL;
- LNode *r=head;
- for(int i=0;i<n;++i){
- LNode *p=new LNode;
- ElemType cin='a';
- cin>>p->data;
- p->next=NULL;
- r->next=p;
- r=p;
- }
- }
-
- int main()
- {
- LinkList list;
-
- //初始化
- printf("单链表正在初始化....\n");
- int InitStatus=InitList(list);
- if (InitStatus=OK){
- printf("单链表初始化成功!\n");
- }else{
- printf("单链表初始化失败!\n");
- }
-
- choice(); //调用功能菜单函数
- int temp=1; //通过改变temp的值来跳出while循环
-
- while(temp) {
- int flag;
- printf("请输入所需的功能编号:\n");
- scanf("%d",&flag);
-
- switch (flag) {//通过开关进行功能选择
- case 1:{//插入元素
- int insertIndex;
- ElemType inserElem;
- printf("请输入插入元素位置及插入元素(请在英文状态下输入): \n");
- scanf("%d,%c",&insertIndex,&inserElem);
- Status InsertS = ListInsert(list, insertIndex, inserElem);
- if(InsertS ==OK){
- printf("向单链表%d个位置,插入元素为%c成功!\n",insertIndex,inserElem);
- printf("======================================\n\n");
- }else{
- printf("向单链表插入元素失败!\n");
- printf("======================================\n\n");
- }
- }
- break;
- case 2:{//求单链表的长度
- int length=GetLinkListLength(list);
- printf("单链表的长度为:%d。 \n",length);
- }
- break;
- case 3:{//取值
- Status GetIndex;
- printf("请输入需要查询的元素的位置:\n");
- scanf("%d",&GetIndex);
- ElemType GetElem;
- int GetStatus=GetLinkList(list,GetIndex, GetElem);
- if (GetStatus=OK){
- printf("从单链表中获取第%d位置元素成功,所获取到的元素为:%c。\n",GetIndex,GetElem);
- }else{
- printf("从单链表中获取第%d位置元素失败!\n",GetIndex);
- }
- }
- break;
- case 4:{//查找
- //查找用引用型参数返回查找元素的位置
- // Status LocateIndex;
- // ElemType LocateElem;
- // printf("请输入想要查找元素:\n");
- // scanf("%c",&LocateElem);
- // LNode *LocateStatus = LocateLinkList(list,LocateElem,LocateIndex);
- // //printf("%d",LocateStatus);
- // if (LocateStatus == NULL) {
- // printf("未查找到需要查找元素!\n");
- // } else {
- // printf("查找到单链表中第%d元素为%c!\n",LocateIndex, LocateStatus->data);
- // }
- //查找用函数返回查找元素的位置
- ElemType LocateElem;
- printf("请输入想要查找元素:\n");
- getchar(); //用于接收回车
- scanf("%c",&LocateElem);
- Status LocateIndex = LocateLinkListElem(list,LocateElem);
- if (LocateIndex > 0) {
- printf("从单链表中查找元素%c成功,它在单链表中的位置为第%d个!\n",LocateElem,LocateIndex);
- } else {
- printf("从单链表中查找元素%c失败!\n",LocateElem);
- }
- }
- break;
- case 5:{//删除
- Status DeleteIndex;
- printf("请输入想要删除元素的位置:\n");
- scanf("%d",&DeleteIndex);
- ElemType DeleteElem;
- ElemType DeleteStatus = ListDelete(list,DeleteIndex,DeleteElem);
- if (DeleteStatus=OK){
- printf("删除单链表第%d个位置的元素成功,删除的元素为:%c。\n",DeleteIndex,DeleteElem);
- }else{
- printf("删除单链表第%d个位置的元素失败!\n",DeleteIndex);
- }
- }
- break;
- case 6:{//销毁
- Status DestoryStatus = DestoryLinkList(list);
- if (DestoryStatus == OK){
- printf("单链表销毁成功!\n");
- }else{
- printf("单链表销毁失败!\n");
- }
- }
- break;
- case 7:{//清空
- Status ClearStatus = ClearLinkList(list);
- if (ClearStatus == OK){
- printf("单链表清空成功!\n");
- }else{
- printf("单链表清空失败!\n");
- }
- }
- break;
- case 8:{//批量插入
- int on;
- printf("请输入想要插入的元素个数:\n");
- scanf("%d", &on);
- ElemType array[on];
- for (int i = 1; i <= on; i++) {
- getchar();
- printf("向单链表第%d个位置插入元素为:", (i));
- scanf("%c", &array[i]);
- }
-
- for (int i = 1; i <= on; i++){
- Status InsertStatus = ListInsert(list,i,array[i]);
- if (InsertStatus=OK){
- printf("向单链表第%d个位置插入元素%c成功!\n",i,array[i]);
- }else{
- printf("向单链表第%d个位置插入元素%c失败!\n",i,array[i]);
- }
- }
- }
- break;
- case 9:{//退出程序
- temp=0;
- // return 0;
- }
- break;
- case 10:{//头插法创建单链表
- // ElemType EnterElement='e';
- // CreateList_H(list,EnterElement);
- // printf("前插法插入%c元素成功!\n",EnterElement);
- }
- break;
- case 11:{//尾插法创建单链表
- // ElemType EnterElem='a';
- // CreateList_R(list,EnterElem);
- // printf("后插法插入%c元素成功!\n",EnterElem);
- }
- break;
- default:
- printf("输入错误,无此功能,请检查输入:\n");
- }
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。