头插法
#include <stdio.h>
#include <stdlib.h>
struct Node //定义结构体
{
char data; //数据域
struct Node * next; //指针域
};
/* 请在这里填写答案 */
void PrintList (struct Node * head)
{
struct Node * s;
if(head == NULL)
{
printf("None");
return;
}
for(s=head;s!=NULL;s = s->next)
{
printf("%c ",s->data);
}
}
int main()
{
struct Node * head = NULL;
head = CreateList(head);
PrintList(head);
return 0;
}
头插法的步骤
1.新节点 struct Node* p;
2.新节点开空间 p=(struct Node*)malloc(sizeof(struct Node));
3.数据存储 p -> data = ch;
4.头插法重点顺序
p->next = head;
head=p;
5.切记要再scanf("%c",&ch);-------完整循环
struct Node* CreateList (struct Node * head)
{
struct Node* p;
char ch;
scanf("%c",&ch);
while(ch!='\n')
{
p=(struct Node *)malloc(sizeof(struct Node));
p->data=ch;
p->next=head;
head=p;
scanf("%c",&ch);
}
return head;
}
尾插法:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node { // 定义结构体类型,并且用 typedef 简化声明
char data; // 数据域
struct Node * next;// 指针域
} Node;
// 尾插法创建链表
Node * createListTailInsertion()
{
Node *head, *temp, *newnode;
char ch;
head = NULL;
scanf("%c", &ch); // 获取第一个字符
while (ch != '\n') {
newnode = (Node*) malloc(sizeof(Node)); // 创建新节点
newnode->data = ch; // 赋值给新节点的数据域
newnode->next = NULL; // 设置新节点的下一个为null
if (head == NULL) // 如果是第一个节点,则设置头指针指向新节点
head = temp = newnode;
else // 否则将新节点添加到链表末尾
{
temp->next = newnode; // 将最后一个节点的指针域指向新节点
temp = newnode; // 更新最后一个节点指针
}
scanf("%c", &ch); // 获取下一个字符
}
return head; // 返回链表头
}
// 打印链表
void printList(Node * head)
{
Node * s;
if(head == NULL)
{
printf("None\n");
return;
}
for(s=head;s!=NULL;s = s->next)
{
printf("%c ",s->data);
}
printf("\n"); // 输出换行符以使输出更清晰
}
int main()
{
Node * head = NULL;
head = createListTailInsertion(); // 使用尾插法创建链表
printList(head); // 打印链表
return 0;
}
尾插法步骤:
1.比头插法多一个尾结点*tail;
struct Node* head,* tail, * p;
2.头插尾插都需要 char ch;----表示数据
3.scanf("%c",&ch)
4.新指针节点开空间 p = (struct Node*)malloc(sizeof(struct Node))
5.存储数据 p->data = ch;
p->next = NULL;
6.头指针的可能性
head ==NULL-------- head = tail = p; // 头指针是第一个节点,设置头指针指向新节点
head != NULL--------tail -> next = p; tail = p;
7.切记 scanf ("%c",&ch);
返回head;
输出链表:
for (head; head!=NULL; head=head->next)
{
printf("%c",head->data);
}
总结注意易错点:
1.while循环里一定要写成 ch!='\n',循环后面一定要加上 scanf("%c",&ch);---更新数据
不要写成scanf("%c",&ch)!=EOF
否则就不会输出第一个字母
2.头插法和尾插法非常重要的记忆方法:
头插法开始只是struct *head,*p;-------尾插法struct *head,*tail,*p;
头插法开始head=NULL ---------- 尾插法 head = tail =NULL;
头插法循环里 if (head==NULL) ----head = p;
else { p->next = head;
head=p;---更新头结点}
尾插法循环里 if(head==NULL)-------head=tail=p;
else{ tail->next = p;
tail=p;--更新尾结点}
Node * createListTailInsertion()
{
struct Node*head,*p;
char ch;
scanf("%c",&ch);
head=NULL;
while(ch!='\n')
//while(scanf("%c",&ch)!=EOF)
// while(1)
{
//if(scanf("%c",&ch)!=1||ch=='\n')break;
p=(struct Node*)malloc(sizeof(struct Node));
p->data=ch;
p->next=NULL;
if(head==NULL) head=p;
else
{
p->next = head;
head=p;
}
scanf("%c",&ch);
}
return head;
}