#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode { ElemType data; struct LinkNode *next; }LinkNode, *LinkList; LinkList InitNull(); LinkList InitListByHeadInsert(); void PrintList(LinkList L); LinkList InitListByTailInsert(); int Len(LinkList L); int GetElem(LinkList L, int index, ElemType *X); int InsertNode(LinkList L, int index, ElemType data); int DeleteNode(LinkList L, int index, ElemType *X); void Reverse(LinkList L); int main() { } //建立空链表 LinkList InitNull() { LinkList L = malloc(sizeof(LinkNode)); L->next = NULL; return L; } //头插法建立单链表 LinkList InitListByHeadInsert() { int data; LinkList temp; LinkList L = malloc(sizeof(LinkNode)); L->next = NULL; printf("请输入数字,-1结束:"); scanf("%d", &data); while(data != -1) { temp = malloc(sizeof(LinkNode)); temp->data = data; temp->next = L->next; L->next = temp; printf("\n请继续输入数字,-1结束:"); scanf("%d", &data); } return L; } //尾插法建立单链表 LinkList InitListByTailInsert() { int data; LinkList temp, tail; LinkList L = malloc(sizeof(LinkNode)); tail = L; L->next = NULL; printf("请输入数字,-1结束:"); scanf("%d", &data); while(data != -1) { temp = malloc(sizeof(LinkNode)); temp->data = data; temp->next = tail->next; tail->next = temp; tail = temp; printf("\n请继续输入数字,-1结束:"); scanf("%d", &data); } return L; } //获取链表中第i个元素的值,用X接受,返回1代表操作成功,0代表失败 ,链表中的索引从0开始 int GetElem(LinkList L, int index, ElemType *X) { LinkList temp = L->next; int i = 0; if(index < 0) { printf("索引位置非法!\n"); return 0; } while(temp != NULL && i < index) { temp = temp->next; i++; } if(temp == NULL) { printf("索引位置非法!\n"); return 0; } else { *X = temp->data; return 1; } } //在链表中插入一个值,index表示元素插入后的位置,索引从0开始,返回1表示操作成功,0表示失败 int InsertNode(LinkList L, int index, ElemType data) { if(index < 0) { printf("插入位置非法!\n"); return 0; } LinkList Ptr = L; LinkList temp = NULL; int i = 0; while(Ptr != NULL && i < index) { Ptr = Ptr->next; i++; } if(Ptr == NULL) { printf("插入位置非法!\n"); return 0; } else { temp = malloc(sizeof(LinkNode)); temp->data = data; temp->next = Ptr->next; Ptr->next = temp; } } //从链表中插入一个值,index表示元素的位置,索引从0开始,返回1表示操作成功,0表示失败,返回元素的值存在X中 int DeleteNode(LinkList L, int index, ElemType *X) { if(index < 0) { printf("删除位置非法!\n"); return 0; } LinkList Ptr = L; LinkList temp = NULL; int i = 0; while(Ptr != NULL && i < index) { Ptr = Ptr->next; i++; } if(Ptr == NULL || Ptr->next == NULL) { printf("删除位置非法!\n"); return 0; } else { temp = Ptr->next; *X = temp->data; Ptr->next = temp->next; free(temp); } } //单链表的逆置 void Reverse(LinkList L) { LinkList CurrentNode = L->next; LinkList NextNode = NULL; L->next = NULL; while(CurrentNode != NULL) { NextNode = CurrentNode->next; CurrentNode->next = L->next; L->next = CurrentNode; CurrentNode = NextNode; } } //求链表的长度 int Len(LinkList L) { LinkList temp = L->next; int len = 0; while(temp != NULL) { len++; temp = temp->next; } return len; } //打印链表中的元素 void PrintList(LinkList L) { LinkList temp = L->next; while(temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); }
时间: 2024-10-13 20:15:21