单链表存储结构
typedef struct LNode{
ElemType data;
struct LNode *next;//存放下一个链表的地址
}LNode,*LinkList;
插入数据
void InsertSLinklist(LinkList &L,int Location,ElemType elem){
//先创建一个数据域为elem的节点
LinkList Insert = (LinkList)malloc(sizeof(LNode));
Insert->data = elem;
//找到Location前面的那个节点。因为要更改它的指针域
LinkList p = L;
int j = 0;
while (p&&j < Location - 1) //当单链表没有找完,且j<Location-1.
//因为当J=location-1时,就已经找到了
{
p = p->next;
j++;
}
//找完以后的p就是要插入位置的前面的节点
Insert->next = p->next;
p->next = Insert;
}
删除某个节点
void DeleteSLinklist(LinkList &L,int Location,int &elem) {
//先找到Location-1处的节点
int j = 0;
LinkList p;
p = L;
while (p&&j < Location-1) {
p = p->next;
j++;
}//结束后p为location-1处的节点
LinkList q;
q = p->next;
p->next = q->next;//直接让location的前驱的指针域指向location的后继
elem = q->data;
free(q);
}
刚开始我的指针传递的过程是这么写的
printf("%d", p->next->data);//4
elem = p->next->data;
p->next=p->next->next;
printf("%d", p->next->data);//3
设置一个新的变量取接收Location位置的原地址,方便free
free(p->next);
这样虽然指针传递没错,但是这样不利于free
之前的内存。内存不被free会有其他的影响。所以便于free的话,使用变量,记录当前需要free的值。最后free就ok!
打印单链表
void ShowSLinklist(LinkList L) {
LinkList p;
p = L->next;
if (L ->next == NULL)
{
printf("链表为空\n");
}
else {
printf("该单链表的数据如下:\n");
while (p) {
printf("%d\t", p->data);
p = p->next;
}
}
}