链表的每个节点分为指针域和数据域,创建链表的过程可以理解为将每个节点的指针域指向其他节点,最终形成一个链条,即链表。
尾插创建链表
创建链表的过程可以大致的说是将当前节点的指针域执指向下一个节点,然后下一个节点的指针域指向下下个节点,不断重复这样的动作。
eg: 有五个节点,数据为别为1,2,3,4,5,创建链表的过程如下:
-
初始情况
-
1节点的指针域指向2节点,此时链表有两个节点,分别是1,2
-
2节点的指针域指向3节点,此时链表有3哥节点,分别是1,2,3
-
重复上面的动作直至链表创建完成
code
// 链表节点定义
typedef struct node{
int data;
struct node *next;
}ElemSN;
// 尾插创建单向链表
ElemSN* createLinkList(int data[],int len){
if(data==NULL||len<=0){
return NULL;
}
ElemSN *head = NULL,*pNew = NULL,*tail = NULL;
for(int i = 0;i<len;i++){
pNew = (ElemSN*)malloc(sizeof(ElemSN));
pNew->data = data[i];
pNew->next = NULL;
if(head==NULL){
head = pNew;
tail = pNew;
}else{
tail->next = pNew;
tail = tail->next;
}
}
return head;
}
// 递归实现
ElemSN* createLinkList1(int data[],int len){
if(data==NULL||len<=0){
return NULL;
}
ElemSN *pNew = malloc(sizeof(ElemSN));
pNew->data = data[0];
pNew->next = createLinkList1(data+1,len-1);
return pNew;
}
头插创建链表
头插创建链表跟尾插刚好相反,新来的节点不作为尾结点,而是作为头结点,不断的插入到链表的头部,并更换头指针的指向。因为后来的节点作为头结点,所以最终形成的链表为数组的倒叙结果。
-
初始情况,只有一个节点。
-
插入第二个节点
-
插入第三个节点
-
以此类推
code
ElemSN* createlinkList2(int data[],int len){
if(data==NULL||len<=0){
return NULL;
}
ElemSN *pNew = NULL,*head = NULL;
for(int i=0;i<len;i++){
pNew = (ElemSN*)malloc(sizeof(ElemSN));
pNew->data = data[i];
pNew->next = head;
head = pNew;
}
return head;
}
网友评论