[数据结构]基本概念、单链表操作
最后更新于:2022-04-01 15:56:15
###1.数据在内存中的存储方式
数据在计算机程序中都是存储在内存空间中的.
1. 连续内存空间,比如申请一个数组,申请内存的大小事先知道。【数组】
1. 非连续内存空间,特点是申请次数无限制,每次固定大小。【链表】
###2.时间复杂度和空间复杂度
- 时间复杂度:同一问题可用不同的算法解决,一个算法的质量优劣将影响算法乃至程序的效率。算法的时间复杂度是一个函数,定量描述算法的运行时间,通常用O表示.
- 空间复杂度:一个算法在运行过程中占用存储空间大小的度量,包括算法本身所占的存储空间、数据输出数据所占用的存储空间的大学、运行过程中临时占用的存储空间的大小这三个方面。
###3.衡量一个算法的优劣的标准
- **正确性**.
所写算法能满足具体问题的要求,对于任何合法的输入可以得出正确的结果。
- **可读性.**
晦涩难懂的算法不易于交流、推广、修改、拓展、维护,在写算法的时候,要尽量写的简明易懂。
- **健壮性.**
输入数据非法时,算法也会做出相应的判断,不会因为输入的错误造成程序瘫痪。
- **时间复杂度和空间复杂度.**
理想的算法应该是时间复杂度和空间复杂度都最佳。对于一个算法,时间复杂度和空间复杂度往往相互影响。
###4.链表基本操作
##### 4.1链表结构体定义
~~~
#include <stdio.h>
#include <stdlib.h>
#include <MATH.h>
typedef struct linklist
{
int data;
struct linklist *next; //单链表
}linknode,*linklistp;
~~~
##### 4.2.头部插入新节点
~~~
//返回头部
linklistp insert_head(linklistp head,linklistp newnode){
newnode->next=head;
head=newnode;
return head;
}
~~~
##### 4.3. 尾部插入新节点
~~~
linklistp insert_tail(linklistp head,linklistp newnode){
if(head==NULL){
head=newnode;
}else{
linklistp temp=head;
while(temp->next!=NULL){
temp=temp->next;
}
newnode->next=temp->next;
temp->next=newnode;
}
return head;
}
~~~
##### 4.4 删除子节点
~~~
//删除节点
linklistp list_delete(linklistp head,int a){
linklistp temp=head;
//1.temp为空,返回NULL
if(temp==NULL){
printf("链表为空\n");
return NULL;
}
//2.正好是首节点
if(temp->data==a){
head=head->next;
free(temp);
return head;
}
//3.不在首节点
linklistp prev=head;
temp=head->next;
while(temp!=NULL&&temp->data!=a){
prev=temp;
temp=temp->next;
}
//3.1 没找到
if(temp==NULL){
printf("不存在\n");
return NULL;
}
prev->next=temp->next;
return head;
}
~~~
##### 4.5查找节点
~~~
//查找第i个元素
int getElem(linklistp head,int i,int a){
if (head->next==NULL)
{
printf("link list is NULL");
return 0;
}
linklistp temp=head;
int j=0;
while(temp->next&&j<i){
temp=temp->next;
++j;
}
if(!temp||j>i){
printf(" 不存在第i个元素\n");
}
a=temp->data;
return a;
}
~~~
##### 4.6 判断链表是否为空
~~~
//判断链表是否为空
_Bool isEmpty(linklistp head){
if (head->next==NULL)
{
printf("链表为空\n");
return 1;
}
return 0;
}
~~~
#####4.7遍历链表
~~~
void output(linklistp head){
linklistp temp=head;
while(temp){
printf("%d\t", temp->data);
temp=temp->next;
}
printf("\n");
}
~~~
##### 4.8 测试代码
~~~
int main(){
linklistp head=NULL;
for (int i = 0; i < 10; ++i)
{
/* code */
linklistp newnode=(linklistp)malloc(sizeof(linknode));
newnode->data=i*10+2;
newnode->next=NULL;
head=insert_head(head,newnode);
}
output(head);
printf("*********删除节点*******\n");
int data=0;
printf("请输入要删除的数据:\n");
scanf("%d",&data);
linklistp temp=list_delete(head,data);
if (temp==NULL)
{
printf("def failture or not has this node");
}else{
head=temp;
output(head);
}
printf("**************************\n");
printf("enter the num you want to find:\n");
printf("%d\n",getElem(head,2,data));
return 0;
}
~~~
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-05_57036c5383ee9.jpg "")