什么是链表?
就是一种增加,删除便捷的数据结构
因为链表要用来增加和删除,所以链表所申请的内存空间应该是不固定的。
什么是链表呢
通过指针的指向来连接起来!因为每个数据中都会有一个指向的地址,所以按指向的地址去寻找,就算他们的地址是没有连续的,也可以通过地址的指向来连接起来!
来看下创建的代码!
以下代码所对应的题目是T^T online judge 1902
#include<stdio.h> #include<stdlib.h> #include<string.h> char x[4]; typedef struct node { int data; struct node *next;//创建一个指向 struct node 类型的指针,类似于int *的指针。 } Node;//先声明一个结构体,来满足指向下一个的数的地址需求。 Node *creat() { Node *s;/*因为使用了typedef struct node{}Node;所以Node==struct node;可以直接用Node来声明一个Node类的指针*/ s=(Node*)malloc(sizeof(Node));//获取一个大小为Node的内存 s->next=NULL;//s->next==s.next
return s; }
//申请一个如上的链表的一部分 int main() { Node *head; Node *p; int a; int j; int n; int m; int i; int qq; int qqq; while(~scanf("%d%d",&n,&m)) { j=0; i=0; head=creat(); p=head; while(1) { Node *s; s=creat(); j++; scanf("%d",&a); s->data=a; p->next=s; p=p->next;//这个p=p->next的意思就是移动到下一位;p->next=s;所以p=s; //if(a==-1)break; if(j>=n)break; }/*上方的代码是int main()中的截取代码,表示为创建一个大小为n个数的链表, 过程如图,
就是这样创建并且连接起来的*/ for(i=0; i<m; i++) { scanf("%s",x); if(x[0]=='A') { scanf("%d%d",&qq,&qqq); add(head,qq,qqq); } if(x[0]=='D') { scanf("%d",&qq); //printf("%d ",qq); del(head,qq); } //printf(".. "); //dis(head); memset(x,0,strlen(x)); } dis(head); clearl(head); } return 0; } /*添加的思路就是,用两个指针去走,一个在前,一个在后。然后插入,具体看下图,代码有对链表内有多个数要添加做出分析!而图示就讲一个:
就完成了添加,多个数要添加做出分析这个不讲感兴趣的自己理解代码*/ void add(Node *p,int x,int y) { Node *q; Node *s; q=p->next; while(q) { if(p->data==x) { s=creat(); s->data=y; p->next=s; s->next=q; if(x==y) {p=p->next->next; q=q->next;} else p=p->next; } else { p=p->next; q=q->next; //printf("\\.. "); } } if(p->data==x) {//printf(".. "); s=creat(); s->data=y; p->next=s; s->next=NULL; } } /*删除 删除的思路,跟添加的思路类似,也是使用两个指针去跑!
void del(Node *p,int x) { Node *q; q=p->next; while(q) { if(q->data==x) { p->next=q->next; free(q); if(p->next!=NULL) q=p->next; else break; } else { p=p->next; q=q->next; } } } /*dis输出链表中的全部数值,这个较简单,只要使用head头指针去跑就可以了,图示如下
就是不断使用p=p->next去移动地址,移向下一位后,输出p->data,就是int值。 */ void dis(Node *p) { p=p->next; while(p) { printf("%d ",p->data); p=p->next; } printf(" "); } /*clear清空链表,就是一个递归,能理解就理解,不能理解我也没办法/摊手*/ void clearl(Node *p) { if(p!=NULL) { clearl(p->next); free(p); } }