1.单链表:链表是一种常见的数据结构。它与常见的数组是不同的,使用数组时先要指定数组包含元素的个数,即为数组的长度,但是如果向这个数组中加入的元素超过了数组的大小时,便不能将内容全部保存。
链表这种存储方式,其元素个数是不受限定的,当进行添加元素的时候存储的个数就会随之改变。
2.单链表初始化以及功能代码
#include<stdlib.h>
#include<stdio.h>
int ListLength = 0;
void travelList(struct Node *LinkList);
struct Node *init_LinkList();
void insertNode(struct Node *LinkList);
void deleteNode(struct Node *LinkList);
void deleteSameNote(struct Node *LinkList);
struct Node {
int Data;
struct Node *Next;
};
int main() {
struct Node *LinkList = init_LinkList();
travelList(LinkList);
insertNode(LinkList);
travelList(LinkList);
deleteNode(LinkList);
travelList(LinkList);
deleteSameNote(LinkList);
travelList(LinkList);
system("pause");
return 0;
}
struct Node *init_LinkList() {
struct Node *Head = (Node*)malloc(sizeof(Node));//头指针中没有数据,只是为了指向第一个节点
if (Head == NULL) {
printf("申请内存空间失败!\n");
exit(-1);
}
Head->Next = (Node*)malloc(sizeof(Node));
struct Node *NextNode = Head->Next;
printf("请初始化链表,输入-1结束\n");
int TheData;
scanf("%d", &TheData);
while (TheData != -1) {
NextNode->Data = TheData;
NextNode->Next = (Node*)malloc(sizeof(Node));
NextNode = NextNode->Next;
ListLength++;
scanf("%d", &TheData);
}
NextNode->Next = NULL;
return Head;
}
void travelList(struct Node *LinkList) {
struct Node *TempList = LinkList->Next;
while (TempList->Next != NULL) {//1 2 3 4 5
printf("%d ",TempList->Data);
TempList = TempList->Next;
}
printf("\n");
}
void insertNode(struct Node *LinkList) {
printf("请输入您要插入的数据\n");
int TheData;
scanf("%d", &TheData);
printf("请输入您要插入的位置\n");
int ThePos;
scanf("%d", &ThePos);
struct Node *InsertNode = (Node*)malloc(sizeof(Node));
InsertNode->Data=TheData;
if (ThePos == 1) {
InsertNode->Next = LinkList->Next;
LinkList->Next = InsertNode;
ListLength++;
}
else {
for (int i = 1; i < ThePos; i++) {
LinkList = LinkList->Next;
}
InsertNode->Next = LinkList->Next;
LinkList->Next = InsertNode;
ListLength++;
}
}
void deleteNode(struct Node *LinkList) {
printf("请输入你要删除的节点的位置\n");
int ThePos;
scanf("%d", &ThePos);
if (ThePos == 1) {
LinkList->Next = LinkList->Next->Next;
ListLength--;
printf("删除成功!\n");
}
else {
for (int i = 1; i < ThePos; i++) {
LinkList = LinkList->Next;
}
LinkList->Next = LinkList->Next->Next;
ListLength++;
}
}
void deleteSameNote(struct Node *LinkList) {
struct Node *P = LinkList->Next;
struct Node *Q;
struct Node *Temp;
while (P->Next != NULL) {
Q = P;
while (Q->Next != NULL) {
if (Q->Next->Data == P->Data) {
Temp = Q->Next;
Q->Next = Temp->Next;
free(Temp);
}
else {
Q = Q->Next;
}
}
P = P->Next;
}
}