1.头插法建立单链表
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;
struct node *next;
} ListNode;
//单链表初始化
void InitList(ListNode *head) {
head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
}
//头插法建立链表
void CreateList(ListNode *head) {
ListNode *p;
int i, j, x, count = 0;
printf("请输入需要建立链表元素的个数:");
scanf("%d", &i);
for (j = 1; j <= i; j++) {
printf("请输入第%d个元素:", j);
scanf("%d", &x);
p = (ListNode*)malloc(sizeof(ListNode));
p->data = x;
p->next = head->next;
head->next = p;
count++;
}
head->data = count;
}
2.尾插法建立单链表
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;
struct node *next;
} ListNode;
//单链表初始化
void InitList(ListNode *head) {
head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
}
//尾插法建立链表
void CreateList1(ListNode *head) {
ListNode *s, *r;
int i, j, x, count = 0;
r = head;
printf("请输入需要建立链表元素的个数:");
scanf("%d", &i);
for (j = 1; j <= i; j++) {
printf("请输入第%d个元素:", j);
scanf("%d", &x);
s = (ListNode*)malloc(sizeof(ListNode));
s->data = x;
r->next = s;
r = r->next;
count++;
}
r->next = NULL;
head->data = count;
}
3.在链表中插入新元素
//插入元素
void InsertLint(ListNode *head) {
ListNode *p, *q, *s;
int i, j, x;
p = head;
printf("请输入需要插入元素的位置:");
scanf("%d", &i);
if (i < 1 || i > p->data + 1) {
printf("插入位置错误,无法插入数据\n");
return;
}
printf("请输入需要插入的元素:");
scanf("%d", &x);
for (j = 1; j <= i; j++) {
q = p;
p = p->next;
}
s = (ListNode*)malloc(sizeof(ListNode));
s->data = x;
s->next = p;
q->next = s;
head->data++;
}
4.删除链表中的元素
//删除元素
void DeleteList(ListNode *head) {
ListNode *p, *q;
int i, j;
p = head;
if (ListEmpty(head)) {
printf("链表为空,无数据删除\n");
return;
} else {
printf("请输入需要删除元素的位置:");
scanf("%d", &i);
if (i < 1 || i > p->data) {
printf("删除位置错误,无法删除数据\n");
return;
}
for (j = 1; j <= i; j++) {
q = p;
p = p->next;
}
q->next = p->next;
free(p);
}
head->data--;
}
5.在链表中查找元素
//查找元素
void GetList(ListNode *head) {
ListNode *p;
int i, j, x;
p = head;
if (ListEmpty(head)) {
printf("链表为空,无法查找数据\n");
return;
} else {
printf("请输入需要查找元素的位置:");
scanf("%d", &i);
if (i < 1 || i > p->data - 1) {
printf("查找位置错误,无法查找数据\n");
return;
}
for (j = 1; j <= i; j++) {
p = p->next;
}
x = p->data;
printf("找到了,这个数为:%d\n", x);
}
}
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;
struct node *next;
} ListNode;
//单链表初始化
void InitList(ListNode *head) {
head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
}
//判空操作
int ListEmpty(ListNode *head) {
return head->next == NULL;
}
//头插法建立链表
void CreateList(ListNode *head) {
ListNode *p;
int i, j, x, count = 0;
printf("请输入需要建立链表元素的个数:");
scanf("%d", &i);
for (j = 1; j <= i; j++) {
printf("请输入第%d个元素:", j);
scanf("%d", &x);
p = (ListNode*)malloc(sizeof(ListNode));
p->data = x;
p->next = head->next;
head->next = p;
count++;
}
head->data = count;
}
//尾插法建立链表
void CreateList1(ListNode *head) {
ListNode *s, *r;
int i, j, x, count = 0;
r = head;
printf("请输入需要建立链表元素的个数:");
scanf("%d", &i);
for (j = 1; j <= i; j++) {
printf("请输入第%d个元素:", j);
scanf("%d", &x);
s = (ListNode*)malloc(sizeof(ListNode));
s->data = x;
r->next = s;
r = r->next;
count++;
}
r->next = NULL;
head->data = count;
}
//插入元素
void InsertLint(ListNode *head) {
ListNode *p, *q, *s;
int i, j, x;
p = head;
printf("请输入需要插入元素的位置:");
scanf("%d", &i);
if (i < 1 || i > p->data + 1) {
printf("插入位置错误,无法插入数据\n");
return;
}
printf("请输入需要插入的元素:");
scanf("%d", &x);
for (j = 1; j <= i; j++) {
q = p;
p = p->next;
}
s = (ListNode*)malloc(sizeof(ListNode));
s->data = x;
s->next = p;
q->next = s;
head->data++;
}
//删除元素
void DeleteList(ListNode *head) {
ListNode *p, *q;
int i, j;
p = head;
if (ListEmpty(head)) {
printf("链表为空,无数据删除\n");
return;
} else {
printf("请输入需要删除元素的位置:");
scanf("%d", &i);
if (i < 1 || i > p->data) {
printf("删除位置错误,无法删除数据\n");
return;
}
for (j = 1; j <= i; j++) {
q = p;
p = p->next;
}
q->next = p->next;
free(p);
}
head->data--;
}
//查找元素
void GetList(ListNode *head) {
ListNode *p;
int i, j, x;
p = head;
if (ListEmpty(head)) {
printf("链表为空,无法查找数据\n");
return;
} else {
printf("请输入需要查找元素的位置:");
scanf("%d", &i);
if (i < 1 || i > p->data - 1) {
printf("查找位置错误,无法查找数据\n");
return;
}
for (j = 1; j <= i; j++) {
p = p->next;
}
x = p->data;
printf("找到了,这个数为:%d\n", x);
}
}
//输出链表元素
void PrintList(ListNode *head) {
ListNode *p;
p = head->next;
if (ListEmpty(head)) {
printf("链表为空,无数据输出!\n");
return;
} else {
printf("链表中的元素分别为:");
while (p) {
printf("%3d", p->data);
p = p->next;
}
printf("\n");
}
}
int main() {
int i;
ListNode head;
InitList(&head);
for (;;) {
printf("-------------------------------------------------\n");
printf("1.头插法建立链表 2.尾插法建立链表\n");
printf("3.删除元素 4.插入元素\n");
printf("5.查找元素 6.输出链表\n");
printf("7.退出\n");
printf("-------------------------------------------------\n");
printf("请选择[1,7]:");
scanf("%d", &i);
while (1 < 1 || i > 7) {
printf("输入错误!\n选择的范围要求在1——7之间!\n");
printf("请重新选择:");
scanf("%d", &i);
}
switch (i) {
case 1:
CreateList(&head);
break;
case 2:
CreateList1(&head);
break;
case 3:
DeleteList(&head);
break;
case 4:
InsertLint(&head);
break;
case 5:
GetList(&head);
break;
case 6:
PrintList(&head);
break;
case 7:
exit(0);
}
}
}