线性链表概述及其结构
所谓“线性”,即为一组数据元素形成前后关系。线性表主要以2种形式在内存中存放,一种是以数组的形式,用数组存放时是连续存放的,当我们需要对其中一个数据元素进行删除或者插入时,需要移动其他数据,并且用数组还需要申请合适的内存空间,太小装不下,太大会造成内存空间浪费。这时,就需要我们的线性链表出手,链表不需要在内存里面连续存放,而是以指针将各数据单元链接起来,所以,我们在进行删除或者插入数据元素时,不需要移动其他数据元素。
现在正式介绍链表,链表是由一系列的结点组成,每个节点包含两个域,一个是数据域,主要用来保存用户数据,可以是任意数据类型;另一个叫指针域,用来保存下一个结点的地址。一个完整的链表包含头结点,中间结点,尾结点(有些代码可没有有尾结点)。其中头结点的数据域是不存放有效数据的,它的指针域存放实际数据链表的第一个数据单元的地址。尾结点的指针域指向NULL(空),作为链表结束的标志。下面是一个线性链表逻辑图借以参考:
基本结构已经知晓,那么接下来就是定义一个结点,定义结点用结构体类型来定义:
struct LinkNode //LinkNode为结点结构体类型名
{
int data; //数据成员定义
struct LinkNode *next; //定义指针域(结点结构体类型名 *指针变量名)
};
线性链表的基本操作
线性链表的基本操作包括创建,插入,删除,输入,销毁等。
1:链表的创建操作
基本思路:就是往空链表中插入若干个结点,并保持前后驱动关系。先创建一个头结点,让head和tail都指向它,并让它的指针域为空,再创建新的数据结点,用指针pnew指向新的数据结点,并将实际的数据放在该结点的数据域,而他的指针域置为NULL,最后将该节点插入到tail所指向结点的后面,同时使tail指向pnew所指向的结点
代码形式如下:
Node*Create_LinkList() { intscore; Node*head,*tail,*pnew; head=(Node*)malloc(sizeof(Node)); //创建头结点if(head==NULL) //创建失败,则返回{ printf("no enough memory\n"); return(NULL); } head->next=NULL; //头结点的指针域置于NULLtail=head; //开始时尾指针指向头指针printf("input the score of students:\n"); while(1) //创建学生线性链表{ scanf("%d",&score); //接收成绩if(score<0) //成绩为负,退出break; pnew=(Node*)malloc(Sizeof(Node)); //创建一个新结点if(pnew==NULL) //若创建失败,返回{ printf("no enough memory\n"); return(NULL); } pnew->score=score; //新结点数据域放输入的成绩pnew->next=NULL; //新结点指针域指向NULLtail->next=pnew; //新结点插入到链表尾tail=pnew; //} return(head); }
2:链表插入:
插入就只需要两步:
void insertData( Node *LinkList,*pnew,int data)
{
Node *newNode=create(data);
newNode->next=headNode->next; //第一步
headNode->next=newNode; //第二步
}
3:链表删除:
删除只需要一步,即图中绿色线的步骤:
preNode->next=curNode->next;
free(curNode);
链表的基本操作还有很多,在这就只讲述了三种,待掌握成熟,会继续精进,感谢友友的读取,记得一键三连哟,阿里嘎多 ,懒洋洋桑!