代码实现
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define ElemType int
typedef struct LNode {ElemType data;struct LNode *next;
} LNode, *LinkList;
bool Empty(LinkList L);
void InitList(LinkList *L) {*L = (LinkList) malloc(sizeof(LNode));(*L)->next = NULL;
}
LinkList ListInsert_Head(LinkList *L) {InitList(L);ElemType Elem;printf("请输入要插入的元素数据(输入0结束):");scanf("%d", &Elem);while (Elem != 0) {LinkList newNode = (LinkList) malloc(sizeof(LNode));newNode->data = Elem;newNode->next = (*L)->next;(*L)->next = newNode;scanf("%d", &Elem);}return *L;
}
LinkList ListInsert_Tail(LinkList *L) {InitList(L);ElemType Elem;LNode *p,*r = (*L);printf("请输入要插入的元素(输入0结束):");scanf("%d", &Elem);while (Elem != 0) {p = (LinkList) malloc(sizeof(LNode));p->data = Elem;p->next = NULL;r->next = p;r = p;scanf("%d", &Elem);}return *L;
}
int Length(LinkList L) {LNode *p = L->next;int num = 0;while (p != NULL) {num++;p = p->next;}return num;
}
LNode *LocateElem(LinkList L, ElemType Elem) {LNode *p = L->next;while (p != NULL && p->data != Elem) {p = p->next;}return p;
}
LNode *GetElem(LinkList L, int index) {LNode *p = L->next;if (index > Length(L)) {printf("索引超出链表长度!\n");return NULL;}while (index > 1) {p = p->next;index--;}return p;
}
void ListInsert(LinkList *L, int index, ElemType Elem) {if (index > Length(*L)) {printf("索引超出链表长度!\n");return;}LNode *p = (*L);LinkList new;InitList(&new);new->data = Elem;while (index > 1) {p = p->next;index--;}new->next = p->next;p->next = new;
}
void ListDelete(LinkList *L, int index) {if (index > Length(*L)) {printf("索引超出链表长度!\n");return;}if (Empty(*L)) {printf("删除失败,链表为空!\n");return;}LNode *p = (*L);while (index > 1) {p = p->next;index--;}p->next = p->next->next;
}
bool Empty(LinkList L) {if (L == NULL || L->next == NULL) {return true;}return false;
}
void DestroyList(LinkList *L) {LNode *p = (*L);while (p != NULL) {LNode *temp = p;p = p->next;free(temp);}*L = NULL;}
void PrintList(LinkList L) {if (Empty(L)) {printf("链表为空!\n");return;}LNode *p = L->next;printf("链表中的元素为:");while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");
}int main() {LinkList head;ElemType Elem;int index;
head = ListInsert_Tail(&head);PrintList(head);printf("链表长度为:%d\n", Length(head));printf("请输入要查找的元素的值:");scanf("%d", &Elem);printf("值为%d的元素的值为%d\n", Elem, LocateElem(head, Elem)->data);printf("请输入要查找的元素的位置:");scanf("%d", &index);printf("位置为%d的元素的值为%d\n", index, GetElem(head, index)->data);printf("请输入要插入的元素的位置:");scanf("%d", &index);printf("请输入要插入的元素的值:");scanf("%d", &Elem);ListInsert(&head, index, Elem);printf("插入元素后的链表:\n");PrintList(head);printf("请输入要删除的元素的位置:");scanf("%d", &index);ListDelete(&head, index);printf("删除元素后的链表:\n");PrintList(head);DestroyList(&head);printf("销毁后的链表:\n");PrintList(head);
}