头插法
#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; // 设置新节点的下一个为nullif (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;
}