#答案有點問題,原本個人單鏈表是帶頭指針的,逆轉後沒有頭指針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;
}