当前位置: 代码迷 >> 综合 >> C语言链表基础知识讲解
  详细解决方案

C语言链表基础知识讲解

热度:60   发布时间:2024-02-08 09:24:43.0

  众所周知,“指针是C语言的精髓”。但是指针到底有什么用。。。好吧,在学习链表的时候深刻地体会到了指针的妙用。今天就献上链表的一些知识,为了看着方便,讲解全都以注释的方式附在了代码旁边,若有错误敬请指出!编译环境是devcpp。

  顺带一提,在CSDN网站上看注释,似乎不太清晰,建议复制代码到编译环境里看!!!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>//先定义结构体,而所谓链表就是由若干个这样的结构体相连而成,链表尾部则连向空指针即NULL,需要注意的是,在这之后,节点的类型应该是"struct F" 
struct F {int data; //链表节点存在的数据,这里作为初学者,只在节点中存储一个int型数据 struct F* next; //表示给这个节点提供下一个节点的地址(这样才算连起来了嘛 (*^▽^*) ) 
}*head = NULL, * p = NULL, * t = NULL;//在这里"head"表示链表的头"p"表示链表中的当前结构体即当前节点t表示p的上一个节点 //创建一个有n个节点的链表 
void MakeLinkList(int n) {//这里代码表示从后往前向链表录入代码 int i;struct F * tail = NULL;for (i = 0, p = tail; i < n; i++) {t = (struct F*)malloc(sizeof(struct F));//为每一个将要出生的链表节点分配空间 t->next = p;scanf("%d", &t->data);p = t;}head = p;return;/* 这里的代码表示的是依次从头到尾将数据录入链表 : int i;for(i=0;i<n;i++){p=(struct X*)malloc(sizeof(struct X));if(head==NULL)head=p;else t->next=p;scanf("%d",&p->data);p->next=NULL;t=p;*/
}//删除链表中第n个数
void del(int n) { int i;for (i = 1, p = head; p != NULL; t = p, p = p->next, i++)if (i == n)break;if (i == n) {if (i == 1)head = p->next;else	t->next = p->next;free(p);printf("delete OK\n");}else printf("delete fail\n");return;
}//将链表中的数输出 
void LiskLinkList() {if (head == NULL)printf("Link list is empty");elsefor (p = head; p != NULL; p = p->next)printf("%d ", p->data);printf("\n");return;}//第n个位置插入了数字m 
void insert(int n, int m) {struct F* temp;int i;temp = (struct F*)malloc(sizeof(struct F));for (i = 1, p = head; i < n && p != NULL; i++, t = p, p = p->next);if (i < n) printf("insert fail\n");else {temp->data = m;if (n == 1)head = temp;else t->next = temp;temp->next = p;printf("insert OK\n");}return;
}//从到链表中第n个节点的数 
void get(int n) { int i;for (i = 1, p = head; p != NULL; i++, p = p->next)if (i == n) {printf("%d\n", p->data);break;}if (p == NULL)printf("get fail\n");return;
}int main() {int  n, sum, that, m;char order[10];scanf("%d", &n);MakeLinkList(n);scanf("%d", &sum);while (sum--) {scanf("%s", order);if (strcmp(order, "show") == 0)LiskLinkList();else if (strcmp(order, "delete") == 0){scanf("%d", &that); del(that);}else if (strcmp(order, "get") == 0){scanf("%d", &that); get(that);}else if (strcmp(order, "insert") == 0){scanf("%d%d", &n, &m); insert(n, m);}}return 0;
}

  代码已经运行过了,应该是没有问题的,顺便提下,在主函数的“sum”,意思while循环执行sum次,每一次都单独输入show、delete等命令。