#答案有点问题,原本个人单链表是带头指针的,逆转后没有头指针node
#include<stdlib.h>数组
#include<stdio.h>指针
//定义数组的大小为100code
//头结点:有时,在链表的第一个结点以前会额外增设一个结点,索引
//结点的数据域通常不存放数据(有些状况下也能够存放链表的长内存
//度等信息),此结点被称为头结点。element
//若头结点的指针域为空(NULL),代表链表是空表。头结点对于链表来讲get
//,不是必须的,在处理某些问题时,给链表添加头结点会使问题变得简单。it
//头指针:永远指向链表中第一个结点的位置(io
//若是链表有头结点,头指针指向头结点;不然,头指针指向首元结点)。
typedef int elementType;
typedef struct Lnode {
//存储的数据 elementType data; //存储下一个指针 struct Lnode *next;
}LinkList;
LinkList* init(LinkList *head) {
head = (LinkList *)malloc(sizeof(LinkList)); if (head == NULL) { printf("内存没啦"); return NULL; } head->next = NULL; printf("初始化成功\n"); return head;
}
void insert(LinkList *head, elementType x, int i) {
if (i < 0) { printf("插入的位置不能为负数\n"); return; } int j = -1; LinkList *p, *s; p = head; while (p->next != NULL && j < i - 1) { p = p->next; j++; } if (j != i - 1) { printf("插入位置有误\n"); return; } s = (LinkList *)malloc(sizeof(LinkList)); if (s == NULL) { printf("内存没了"); return; } s->data = x; s->next = p->next; p->next = s; printf("插入成功\n");
}
//根据索引取值 ,咱们没有判断索引的位置是否有问题
int getItem(LinkList *head, int i) {
LinkList *p = head; int j = -1; while (p != NULL && j < i-1) { j++; p = p->next; } //这个地方返回-1是一个bug if (j != i-1) return -1; return p->data;
}
void delete1(LinkList *head, int i) {
int j = -1; LinkList *p, *s; p = head; while (p->next != NULL && j < i - 1) { p = p->next; j++; } if (j != i - 1) { printf("删除位置有误\n"); return; } if (p->next == NULL) { printf("位置不存在\n"); return; } s = p->next; p->next = s->next; free(s); return;
} LinkList *reverse(LinkList *head) {
LinkList *prev = NULL; LinkList *cur = head; LinkList *tmp; while (cur) { tmp = cur->next; cur->next = prev; prev = cur; cur = tmp; } return prev;
} int main() {
//建立一个空表 LinkList *head=NULL; head = init(head); for (int i = 0; i < 10; i++) insert(head, i + 1, i); LinkList *te = reverse(head); int x; // // delete1(head,11); for (int i = 0; i < 10; i++) { x = getItem(te, i); printf("%d\n", x); } getchar(); return 0;
}