#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{ //定义单链表结点类型
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
LinkList Head_Insert(){ //逆向建立单链表
LNode *s; int x;
LinkList L = (LinkList)malloc(sizeof(LNode)); //创建头结点
L->next = NULL; //初始指向空链表
/*scanf("%d",&x); //输入结点的值 (用&的我都编译不了,只能用指针,可能因为我是用菜鸟工具编译的?)
while(x != 9999){ //输入9999时结束
s = (LinkList)malloc(sizeof(LNode)); //创建新节点
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}*/
char ar[4] = {'a','b','c','d'};
int length = sizeof(ar)/sizeof(ar[0]);
for(int i = 0; i < length; i++){
s = (LinkList)malloc(sizeof(LNode));
s->data = ar[i];
s->next = L->next;
L->next = s;
}
return L;
}
LinkList Last_Insert(){
LinkList L = (LinkList)malloc(sizeof(LNode));//创建头结点
L->next = NULL; //初始指向空链表
LNode *q = L; //创建尾指针
char ar[4] = {'a','b','c','d'};
int length = sizeof(ar)/sizeof(ar[0]);
for(int i = 0; i < length; i++){
LNode *s = (LinkList)malloc(sizeof(LNode)); //新建结点
s->data = ar[i]; //填充数据域
q->next = s; //尾指针指向新节点
s->next = NULL; //新节点指针域置空
q = q->next; //更新尾指针(其实有点不明白为啥得更新尾指针,前面尾指针的指针域不是已经指向新节点了吗?)
}
return L;
}
int main()
{
LinkList L;
L = Head_Insert(&L); //头插法
while(L){ //打印链表
printf("%c",L->data);
L = L->next;
}
printf("\n");
L = Last_Insert(&L); //尾插法
while(L){ //打印链表
printf("%c",L->data);
L = L->next;
}
}
C语言菜鸟,最近才开始捡起来,如有错误请各位大佬指出!
20230821 更新 ------------------------------------------------------------------------------------------------------------
我发现用下面这种方法比较好理解尾插法
LinkList Last_Insert2(){
LinkList L = (LinkList)malloc(sizeof(LNode));//创建头结点
L->next = NULL; //初始指向空链表
LNode *temp = L;
char ar[4] = {'a','b','c','d'};
int length = sizeof(ar)/sizeof(ar[0]);
for(int i = 0; i < length; i++){
LNode *s = (LinkList)malloc(sizeof(LNode)); //新建结点
s->data = ar[i]; //数据域赋值
while(temp->next != NULL){ //定位到末尾结点
temp = temp->next;
}
temp->next = s; //末尾指针结点指向新结点
s->next = NULL; //新结点指针域置空
}
return L;
}