单链表无非就是增删改查,还有啥吗???好像没了
A. 读入链表(增)
1. 尾插法读入链表
.
有无头结点的利弊
有头结点
a. 更快删除/插入第一个结点;
b. 确保head的地址不变化;
无头结点
. …好像没优点…
数据域为一个数
a. 无头结点
struct ListNode *readlist()
{
struct ListNode *q,*head,*tail;
head=tail=NULL;
q=(struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&q->data);
while(q->data!=-1)
{
//让 head 成为第一个q;
if(head==NULL)
{
head=q;
head->next=NULL;
}
//以下让倒数第二个指向倒数第一个, 且让tail成为最后一个;
if(tail!=NULL)
{
tail->next=q;
}
tail=q;
tail->next=NULL;
q=(struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&q->data);
}
return head;
}
b. 有头结点
struct ListNode *readlist()
{
struct ListNode *p,*head,*tail;
head=tail=NULL;
head = (struct ListNode*)malloc(sizeof(struct ListNode));//建立头节点
head->data=0; head->next=NULL;//安全起见
while(1)
{
p = (struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&p->data);
if(p->data == -1)
{
break;
}
//下面这个判断让 *头结点* 指向 第一个 *q*;
if(head->next == NULL)
{
head->next = p;
}
//以下同 无头结点
if(tail != NULL)
{
tail->next = p;
}
tail = p;
tail->next = NULL;
}
return head;
}
2. 头插法读入链表
struct ListNode *createlist()
{
struct ListNode *head = NULL, *now = NULL;
int num;
while(1)
{
scanf("%d", &num);
if(num == -1){
return head;
}
now = (struct ListNode *)malloc( sizeof(struct ListNode) );
now->data = num;
now->next = head;
head = now;
}
}
B. 删除某节点(删)
struct ListNode *deletem( struct ListNode *L, int key )
{
struct ListNode *p1,*pre,*head;//*p1为查找指针,*pre跟在后面。
pre=L; p1=pre->next; head=L;
while(pre->next != NULL)
{
if( p1->data == key )// 若是需要删除的节点那么前一个指向后一个,free这一个
{
pre->next = p1->next;
free(p1);
p1 = pre->next;
}
else// 若不是需要删除的节点那么则向下查找
{
pre=pre->next;
p1=p1->next;
}
}
return L->next;//因为有头节点所以将头节点略过后返回。
}
C. 查找某节点(查)
举个栗子:用存在数据域中的 姓名(也可以用其他的数据) 来查找某节点,查到返回节点,没查到返回NULL。
struct Node *search(struct Node* headNode, char *name){
struct Node *pMove = headNode->next;
while(strcmp(pMove->data.name, name)){
pMove = pMove->next;
if(pMove == NULL){
return NULL;
}
}
return pMove;
}
D. 修改某节点(改)
就是先查找,不是可以得到查找到的节点吗,然后修改查找后节点的数据域(就是你里面存放的数据,想改啥就改啥)即可
E. 遍历链表输出(查)
emmmmm,遍历一下也算查吧
方法一:
void printlist( struct ListNode *head )
{
struct ListNode *p;
for ( p = head; p != NULL; p = p->next )
printf("%d ", p->data);
}
方法二:
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
}