【数据结构-链表】头插法和尾插法建立单链表

来源:互联网 发布:不想上班 知乎 编辑:程序博客网 时间:2024/05/19 06:14
//尾插法比较常用,尾插法需要利用一个头结点。
//头插法不需要头结点,但是需要一个空指针。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char data;
struct node *next;
}LinkList;
LinkList* Create_Front();//头插法建立单链表
LinkList* Create_End();//尾插法建立单链表
void ShowLinkList(LinkList* h);//显示单链表


//printf("单链表显示\n");
//ShowLinkList(head);

之前对头插法的理解有些偏差,这里做一下更正。


这里的头结点并不是开始使得head=NULL,而是head->next=NULL,然后在添加数值的过程中,head这个头结点是一直向前移动的。

LinkList* Create_Front()
{
LinkList* head1, *p;
char ch;
head1 ->next= NULL;
printf("输入数据直到输入‘#’结束\n");
while ((ch = getchar()) != '#')
{
p = (LinkList*)malloc(sizeof(LinkList));
p->data = ch;
p->next = head1->next;//头插法就这个还有head=p是核心,但是头插法数据是逆序的。头插法不需要头结点,只需要一个空指针。
head1->next= p;
}
return head1->next;
}
LinkList* Create_End()
{
LinkList* head2, *e, *p;
char ch;
head2 = (LinkList*)malloc(sizeof(LinkList));
e = head2;
printf("输入数据直到输入‘#’结束\n");
while ((ch = getchar()) != '#')
{
p = (LinkList*)malloc(sizeof(LinkList));
p->data = ch;
   e->next = p;//e指向输入的下一个节点
e = p;

}
e->next = NULL;

return head2->next;//尾插法比头插法多了一个新的指针e
}
void ShowLinkList(LinkList* h)
{
while (h->next != NULL)
{
printf("%c", h->data);
h = h->next;
}
printf("%c", h->data);
printf("\n");
}
int main(void)
{
LinkList* head;
head = Create_End();
ShowLinkList(head);

}

好吧我又把单链表的尾插法与删除插入放在一起做了一下。

#include<iostream>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
}*LinkList,LinkNode;
LinkList Create_End();
void printLinkList(LinkList &L);
void deleteLinkList(LinkList &L);
void AddLinkList(LinkList &L);
LinkList Create_End()
{
LinkNode *head, *e, *p;
int key;
e = new LinkNode;
printf("请输入您要插入的数据,以-123结束!\n");
scanf("%d", &key);
head = e;
while (key != -123)
{
p = new LinkNode;
p->data = key;
e->next = p;
e = p;
printf("请输入您要插入的数据,以-123结束!\n");
scanf("%d", &key);
}
e->next = NULL;
return head->next;
}
void deleteLinkList(LinkList &L)
{
printf("您要删除的数字是:");
int key;
scanf("%d", &key);
LinkList p,q;
p =L;
q = new LinkNode;
while (p->data != key)
{
q = p;
p = q->next;
}
q->next = p->next;
delete p;
}
void AddLinkList(LinkList &L)
{
LinkList p,newNode;
p = L;
printf("您要插入的位置是:");
int place;
scanf("%d", &place);
printf("您要插入的数是:");
int elem;
scanf("%d", &elem);
int i = 1;
while (i != place-1)
{
p = p->next;
i++;
}
newNode = new LinkNode;
newNode->data = elem;
newNode->next = p->next;
p->next = newNode;
}
void printLinkList(LinkList &L)
{
LinkList p = L;
while (p->next != NULL)
{
printf("%d->", p->data);
p = p->next;
}
printf("%d", p->data);
}
int main(void)
{
LinkList L;
L=Create_End();
printLinkList(L);
deleteLinkList(L);
printLinkList(L);
AddLinkList(L);
printLinkList(L);
}


0 0