LINKED LIST
创建链表
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
struct ListNode
{
int data;
ListNode *next;
};
void CreateListHead(ListNode **head, int n)
{
ListNode *p;
ListNode *q;
srand(time(0)); //初始化随机种子
*head = (ListNode *)malloc(sizeof(ListNode));
q = *head;
for(int i = 0; i < n; i++){
p = (ListNode *)malloc(sizeof(ListNode));
p->data = rand()%100+1;
q->next = p;
q = p;
}
p->next = NULL;
}
遍历整个表
void PrintfList(ListNode **head)
{
ListNode *p;
p = *head;
while(p = p->next){
printf("%d ",p->data);
}
}
删除整个表
bool ClearList(ListNode **head)
{
ListNode *p;
ListNode *q;
p = (*head)->next;
while(p){
q = p->next;
free(p);
p = q;
}
(*head)->next = NULL;
return 1;
}
插入一个结点
void ListInsert(ListNode **head, int i, int a)
{
int j = 1;
ListNode *p;
ListNode *q;
p = (*head);
while(p && (j < i)){
j++;
p = p->next;
}
q = (ListNode *)malloc(sizeof(ListNode));
q->data = a;
q->next = p->next;
p->next = q;
}
删除一个结点
void ListDelete(ListNode **head, int i)
{
int j = 1;
ListNode *p;
ListNode *q;
p = (*head);
while(p && (j < i)){
j++;
p = p->next;
}
q = p->next;
p->next = q->next;
free(q);
}
int main()
{
int n = 9;
int i = 4;
int a = 99;
ListNode *listNode;
CreateList(&listNode ,n);
PrintfList(&listNode);
ListInsert(&listNode, i, a);
printf("\n");
PrintfList(&listNode);
ListDelete(&listNode,i);
printf("\n");
PrintfList(&listNode);
//if(ClearList(&listNode))
// printf("\n OK! \n");
return 0;
}
循环列表就是把单链表结尾指向空指针改为指向头结点。
双向链表在单链表的没个节点中,在设置一个指向其前驱结点的指针域