今天晚上又重新温故了链表的简单操作
1关于链表的定义在此不多赘述,该文件为link.h文件
#define ElemType chartypedef struct Node{ ElemType data; struct Node * next;}Node, *LinkList;
初始化
#include#include "link.h"// initvoid InitList(LinkList *L){ *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL;}int main(int argc, char const *argv[]){ Node *p = NULL; InitList(&p); return 0;}
在初始化时候,为什么形参是一个二级指针呢?
看主函数,我们明白p所指向的事一个头结点,头结点的下一个结点才是第一个元素结点,这也是为什么p为二级指针的原因
2接下来是链表的插入,输入若干个字符以‘$’为结束符
// 用头插法创建链表void CreatFromHead(LinkList L){ Node *s; char c; int flag = 1; while(flag) { c = getchar(); if(c != '$') { s = (LinkList)malloc(sizeof(Node)); s->data = c; s->next = L->next; L->next = s; } else { flag = 0; } }}void CreatFromTail(Node *L){ Node *r, *s; char c; int flag = 1; r = L; while(flag) { c = getchar(); if(c != '$') { s = (LinkList)malloc(sizeof(Node)); s->data = c; r->next = s; r = s; } else { flag = 0; r->next = NULL; } }}
输入1234,对应头插法的结果是4321,对应尾插法的结果是1234
3链表的打印
void print(Node *L){ Node *t, *p = L; t = p->next; //t是头结点 while(t != NULL) { printf("%c", t->data); t = t->next; }}
因为链表的第一个元素是第二个结点,因此我们定义了t变量
4查出第链表中第i个元素
Node* Get(Node *L, int i){ Node *p; int j = 0; if(i < 0) return NULL; p = L; for(j = 0; j < i && p->next != NULL; j++) { p = p->next; } if(j == i) return p; else return NULL;}
也比较简单,在遍历的时候考虑,有没有结束和是否到了i这个位置两个因素即可。
下面是所有的代码
1 #include2 #include "link.h" 3 4 // init 5 void InitList(LinkList *L) 6 { 7 *L = (LinkList)malloc(sizeof(Node)); 8 (*L)->next = NULL; 9 }10 11 // 用头插法创建链表12 13 void CreatFromHead(LinkList L)14 {15 Node *s;16 char c;17 int flag = 1;18 while(flag)19 {20 c = getchar();21 if(c != '$')22 {23 s = (LinkList)malloc(sizeof(Node));24 s->data = c;25 s->next = L->next;26 L->next = s;27 }28 else29 {30 flag = 0;31 }32 }33 }34 35 void CreatFromTail(Node *L)36 {37 Node *r, *s;38 char c;39 int flag = 1;40 r = L;41 while(flag)42 {43 c = getchar();44 if(c != '$')45 {46 s = (LinkList)malloc(sizeof(Node));47 s->data = c;48 r->next = s;49 r = s;50 }51 else52 {53 flag = 0;54 r->next = NULL;55 }56 }57 }58 59 60 void print(Node *L)61 {62 Node *t, *p = L;63 t = p->next; //t是头结点64 while(t != NULL)65 {66 printf("%c", t->data);67 t = t->next;68 }69 }70 71 Node* Get(Node *L, int i)72 {73 Node *p;74 int j = 0;75 if(i < 0)76 return NULL;77 p = L;78 79 for(j = 0; j < i && p->next != NULL; j++)80 {81 p = p->next;82 }83 if(j == i)84 return p;85 else86 return NULL;87 }88 89 int main(int argc, char const *argv[])90 {91 Node *p = NULL;92 InitList(&p);93 CreatFromTail(p);94 print(p);95 return 0;96 }
心得:
哈哈,再一次玩链表是靠自己一点点看书,自己一点点理解起来,说真的当时院长讲链表的时候自己一点也没搞清楚,但是自己花时间琢磨,慢慢的也就理解了