双向链表(C语言)
双向链表(C语言)
一:初始化以及创建:
struct Node { int data; Node* prior; Node* next; }; int Init(Node* L) {//初始化 Node* temp = (Node*)malloc(sizeof(Node)); if (!L) return -1; L->prior = NULL;//前面是指针引进,所以不需要使用指针符号来指向 L->next = NULL; } int CreateNewData(Node* L) {//创建新表 int n; Node* p = L; printf("请输入你要输入的个数\n"); scanf("%d", &n); for (int i = 1; i <= n; i++) { Node* q = (Node*)malloc(sizeof(Node)); p->next = q; printf("请输入第%d个元素的值", i); scanf("%d", &q->data); q->prior = p;//主要元素仍然是p,而p也只是暂时存在为内存地址分配对应的值的 q->next = NULL; p = q; } return 0; }
二:插入以及删除操作
int InsertData(Node* L, int num, int elem) { Node* p, * q; int i; p = L; for (int i = 1; i < num; i++) { p = p->next; } q = (Node*)malloc(sizeof(Node)); if (q) {//这里需要好好琢磨一下,比较难理解的 q->data = elem; p->next->prior = q; q->next = p->next; p->next = q; q->prior = p; } return 0; } int DeleData(Node* L, int num) { Node* p, * q; //需要的就是把需要删除的位置跳过去就可以了,同时释放那个内存所占用的空间 p = L->next; q = L; for (int i = 1; i < num; i++) { p = p->next; q = q->next; } p->next->prior = q; q->next = p->next; free(p); return 0; }
附加图示理解:
三:双向链表遍历:
void print(Node *L) {//输出双向链表的所有的元素 Node *p; p=L->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } }