线性表的链式存储结构称为链表。在链表的存储中,每个结点不仅包含所存元素本身的信息,还包含元素之间逻辑关系的信息,即前驱结点包含后继结点的地址信息,这样就可以通过前驱结点中的地址信息方便地找到后继结点的位置。
(1)链表不支持随机访问。
(2)链表的结点的存储空间利用率较之顺序表稍低一些。
(3)链表支持存储空间的动态分配。
(4)在链表中进行插入操作无需移动元素。
typedef struct Node{ int data; struct Node *next;}Node;4.单链表实现增删查
头插法图:
实现:
#include<stdio.h>#include<stdlib.h>typedef struct Node{ int data; struct Node *next;}Node;//头插法创建链表Node *createListByHead(Node *A){ int length,i,x; Node *p,*s; A=(Node *)malloc(sizeof(Node)); if(A ==NULL){ PRintf("ERROR"); exit(0); } A->next=NULL; p=A; scanf("%d", &length); for(i=0;i<length;i++){ scanf("%d", &x); s=(Node *)malloc(sizeof(Node)); if(s ==NULL){ printf("ERROR"); exit(0); } s->data=x; s->next=p->next; p->next=s; } return A;}//尾插法创建链表Node *createListByTail(Node *B){ int length,i,x; Node *p,*q; B=(Node *)malloc(sizeof(Node)); if(B==NULL){ printf("ERROR"); } B->next=NULL; p=B; scanf("%d",&length); for(i=0;i<length;i++){ scanf("%d",&x); q=(Node *)malloc(sizeof(Node)); q->data=x; p->next=q; p=p->next; } p->next=NULL; return B;}//查询输入值是否在链表中int findVal(Node *C,int x){ Node *p=C->next; while(p !=NULL){ if(p->data==x){ return 1; } p=p->next; } return 0;}//删除单链表结点int deleteList(Node *A,int x){ Node *p=A; Node *q; if(findVal(A,x)==0){ return 0; } while(p !=NULL){ if(p->next->data==x){ q=p->next; p->next=q->next; free(q); return 1; } p=p->next; } return 0;}//打印链表所有值void printList(Node *A){ Node *p=A->next; printf("打印链表结果:/n"); while(p !=NULL){ printf("%d ",p->data); p=p->next; } printf("/n");}void main(){ Node *A,*B; int x; //B=createListByHead(A); B=createListByTail(A); printList(B); printf("删除值:/n"); scanf("%d",&x); deleteList(B,x); printList(B); //printf("%d",findVal(B,x));}结果:
新闻热点
疑难解答