先找到了一些与单链表相关的概念
1.数据域:ai元素存储自身信息 2.指针域:ai元素存储指向后继元素存储位置的信息 3.结点:包含数据域和指针域 4.单链表:每个结点只包含一个指针域的线性表 5.头指针(要素):链表中第一个结点的存储位置(线性表最后一个结点指针为空) 6.头结点(非要素):单链表第一个结点前附设一个结点(其指针域指向第一个结点的指针) (若线性表是空表则头结点的指针域为空)自己新学到的方法:头插法与尾插法。 头插法(就是你输入的新元素得被插入到前面,而你输入的最后一个元素处在链表的第一位:
//首先要创建一个结构体,例如(学生信息的结构体) struct student { int sno; //学号 char name[40]; //姓名 char gender[10];//性别 int age; //年龄 }; //然后建立一个链表的结构体 typedef struct Node { ElemType data;//数据域 struct Node *next;//指针域 }Node; typedef struct Node *LinkList; //定义链表LinkList.这里使得LinkList==struct Node *这个是自定义函数的部分
void createlist(LinkList *phead,int n)//头插法创表返回值为空 { LinkList pnew;声明指针pnew *phead=(LinkList)malloc(sizeof(Node));//为phead开辟内存空间 (*phead)->next=NULL;//建立带头节点的表 for(i=0;i<n;i++) { phead=(LinkList)malloc(sizeof(Node)); scanf("%d",&phead->data); pnew->next=(*phead)->next;//生成新结点赋值给pnew (*phead)->next=pnew;//pnew插入到前一结点前面 } }思路:首先建立一个指针pnew,为phead开辟空间,也就是让phead这个指针指向内存中的一个位置, phead->next= NULL让phead指向的空间为空, 接着进入循环,开始不断地建立新的房间,pnew也不断地指向新的空间,scanf("%d",&phead->data);表示输入数据, pnew->next=(*phead)->next;表示pnew->next指向了phead->next指向的空间的首地址(可以画图理解一下) (*phead)->next=pnew; (*phead)->next不再指NULL,指向了pnew指向的空间的首地址。
尾插法(正常的思维模式,输出的顺序就是输入的顺序):
void createlisttail(LinkList *phead,int n) { LinkList pnew,ptail;//ptail是指向链表的变量 *phead=(LinkList)malloc(sizeof(Node)); ptail=*phead; for(int i=0;i<n;i++) { pnew=(Node *)malloc(sizeof(Node)); scanf("%d",&pnew->data); ptail->next=pnew;//起到一个连线的作用 ptail=pnew;//ptail始终指向最后一个节点(元素) } ptail->next=NULL; }之前的与头插法一样,但在定义指针的时候定义一个尾指针, 尾指针永远都指向链表的尾(最后一个节点) ptail->next=pnew;ptail->next 指向pnew 指向的空间,即指向下一个节点 ptail=pnew;ptail后移