第七周第三天:单链表

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;

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。