介绍
一个单链表必须有一个首指针指向单链表中的第一个节点。
单链表一般含有两个域,一个是存放数据信息的info域,另一个是指向该节点的后继节点存放地址的指针next域。
源码
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct node
{
datatype info;
struct node *next;
}node;
node *init() {
return NULL;
}
void display(node *head)
{
node *p;
p = head;
if (!p)
printf("\n单链表是空的");
else
{
printf("\n单链表的各个结点的值为:\n");
while (p) {
printf("%5d", p->info);
p = p->next;
}
}
}
node *front() {
node *head = NULL,*s;
int x;
scanf("%d", &x);
while (x) {
s = (node*)malloc(sizeof(node));
s->info = x;
s->next = head;
head = s;
scanf("%d", &x);
}
return head;
}
node *append()
{
node *p, *s, *head = NULL;
int x;
s = (node*)malloc(sizeof(node));
scanf("%d", &x);
while (x){
p = (node*)malloc(sizeof(node));
p->info = x;
if (head == NULL)
head = p;
else
s->next = p;
s = p;
scanf("%d", &x);
}
if(s!=NULL)
s->next = NULL;
return head;
}
node *find(node *head, int i) {
int j = 1;
node *p = head;
if (i < 1)
return NULL;
while (p&&i != j) {
p = p->next;
++j;
}
return p;
}
node *insert(node *head, int x, int i) {
node *p, *q;
q = find(head, i);
if (!q&&i != 0)
printf("找不到第%d个节点,不能插入%d", i, x);
else {
p = (node*)malloc(sizeof(node));
p->info = x;
if (i == 0) {
p->next = head;
head = p;
}
else {
p->next = q->next;
q->next = p;
}
}
return head;
}
node *dele(node *head, int x) {
node *pre = NULL, *p;
if (!head)
{
printf("单链表是空的!");
return head;
}
p = head;
while (p&&p->info != x) {
pre = p;
p = p->next;
}
if (p) {
if (!pre)
head = head->next; //要删除第一个节点
else
pre->next = p->next;
free(p);
}
return head;
}
node *reverse(node *head) {
node *p = head->next, *q;
head->next = NULL;
while (p) {
q = p;
p = p->next;
q->next = head;
head = q;
}
return head;
}
void count(node *head) {
node *p = head;
int count = 0;
while (p) {
p = p->next;
++count;
}
printf("一共有%d个几点.", count);
}
int main()
{
int x,i;
node *head;
init();
printf("===================================================\n");
printf("后插法建立单链表。(输入 0 停止插入)\n");
printf("请输入要建立的结点:");
head = append();
display(head);
printf("\n===================================================\n");
printf("===================================================\n");
printf("前插法建立单链表。(输入 0 停止插入)\n");
printf("请输入要建立的结点:");
head = front();
display(head);
printf("\n===================================================\n");
printf("请输入你要搜索的节点位置:");
scanf("%d", &i);
printf("搜索的节点为:%d",find(head, i)->info);
printf("\n===================================================\n");
printf("请输入要插入的数值和节点位置(其后):");
scanf("%d%d", &x, &i);
head = insert(head, x, i);
display(head);
printf("\n===================================================\n");
printf("请输入要删除的节点数值:");
scanf("%d", &x);
head = dele(head, x);
printf("删除后的链表为:");
display(head);
printf("\n===================================================\n");
printf("倒置该链表后为:");
head = reverse(head);
display(head);
printf("\n===================================================\n");
head = reverse(head);
count(head);
return 0;
}