#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node_t;
node_t *make_node(int val)
{
node_t *p = (node_t *)malloc(sizeof(node_t));
if(p)
{
p->data = val;
p->next = NULL;
}
return p;
}
node_t *link_insert1(node_t *head, int val)//insert end
{
node_t *insertp = make_node(val);
node_t *tail;
if(insertp == NULL || head == NULL)
{
if(head == NULL)
{
head = insertp;
}
return head;
}
for(tail = head; tail->next; tail = tail->next)
;
tail->next = insertp;
return head;
}
node_t *link_insert2(node_t *head, int val)//insert head
{
node_t *insertp = make_node(val);
if(insertp == NULL && head != NULL)
{
return head;
}
insertp->next = head;
head = insertp;
return head;
}
node_t *link_insert3(node_t *head, int val)//sort insert
{
node_t *insertp = make_node(val), *pre, *cur;
if(insertp == NULL || head == NULL)
{
if(head == NULL)
head = insertp;
return head;
}
for(pre = cur = head; cur && cur->data < val; pre = cur, cur = cur->next)
;
if(cur == head)
{
insertp->next = head;
head = insertp;
}
else
{
pre->next = insertp;
insertp->next = cur;
}
return head;
}
void link_print(node_t *head)
{
node_t *cur;
for(cur = head; cur; cur = cur->next)
printf("--%d--\n", cur->data);
}
void link_destroy(node_t *head)
{
node_t *cur, *next;
for(cur = head; cur; cur = next)
{
next = cur->next;
free(cur);
}
}
node_t *link_remove(node_t *head, int val)
{
node_t *rmp = NULL, *pre, *cur;
if(head == NULL)
return NULL;
if(head->data == val)
{
rmp = head;
head = head->next;
return rmp;
}
for(pre = head, cur = head->next; cur; pre = pre->next, cur = cur->next)
{
if(cur->data == val)
{
rmp = cur;
pre->next = cur->next;
rmp->next = NULL;
return rmp;
}
}
return NULL;
}
int main(void)
{
int n;
node_t *head = NULL, *rmp;
while(1)
{
scanf("%d", &n);
if(n == 0)
break;
head = link_insert3(head, n);
}
rmp = link_remove(head, 3);
link_print(head);
link_destroy(head);
return 0;
}
linklist reverse
#include <stdio.h>
#include <stdlib.h>
#define LEN 5
typedef struct node
{
int n;
struct node *next;
}node_t;
node_t *create(node_t *head, int len)
{
int i;
node_t *cur, *tail;
for(i = 0; i < len; i++)
{
cur = (node_t *)malloc(sizeof(node_t));
cur->n = i;
cur->next = NULL;
if(i == 0)
head = cur;
else
tail->next = cur;
tail = cur;
}
return head;
}
/*
node_t *reverse(node_t *head)
{
node_t *pre, *next, *cur;
int i = 1;
pre = head;
cur = next = head->next;
while(cur){
printf("i = %d\n", i++);
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
head->next = NULL;
head = cur;
return pre;
}
*/
node_t *reverse(node_t *head)
{
if(head == NULL || head->next == NULL)
return head;
node_t *pre = head;
node_t *cur = pre->next;
node_t *next = cur->next;
pre->next = NULL;
while(next != NULL)
{
cur->next = pre;
pre = cur;
cur = next;
next = next->next;
}
cur->next = pre;
head = cur;
return head;
}
int main(void)
{
node_t *head = NULL, *cur, *del;
head = create(head, LEN);
for(cur = head; cur != NULL; cur = cur->next)
{
printf("--%d--", cur->n);
}
printf("\n");
head = reverse(head);
cur = head;
while(cur != NULL)
{
printf("==%d==", cur->n);
del = cur;
cur = cur->next;
free(del);
}
printf("\n");
return 0;
}
/*
判断链表中是否有环
*/
#include <stdio.h>
#include <stdlib.h>
//#include "stdafx.h"
#define NUM 10
typedef struct node
{
unsigned n;
struct node *next;
}node_t;
node_t *create(node_t *head, int len)
{
int i;
node_t *cur, *tail;
for(i = 0; i < len; i++)
{
cur = (node_t *)malloc(sizeof(node_t));
if(cur == NULL)
{
perror("malloc fail");
exit(1);
}
cur->n = i + 1;
cur->next = NULL;
if(i == 0)
{
head = tail = cur;
}
else
{
tail->next = cur;
tail = cur;
}
}
tail->next = head;
return head;
}
int main(void)
{
node_t *head = NULL, *cur, *pre;
head = create(head, NUM);
pre = cur = head;
while(1)
{
pre = pre->next;
cur = cur->next->next;
if(pre == NULL || cur == NULL)
{
printf("No Ring!\n");
return 0;
}
if(pre == cur)
{
printf("Ring occurred!\n");
return 0;
}
}
return 0;
}
//add 计算,两个数位数相等,或head1 >head2
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
unsigned int n;
struct node *next;
}node_t;
node_t *creat(node_t *head, char *str)
{
char *bkup = str;
node_t *cur;
while(*bkup)
{
cur = malloc(sizeof(node_t));
cur->n = *bkup - '0';
cur->next = head;
head = cur;
bkup++;
}
return head;
}
void show(node_t *head)
{
node_t *cur = head;
while(cur)
{
printf("%d ", cur->n);
cur = cur->next;
}
printf("\n");
}
node_t *add(node_t *head1, node_t *head2, node_t *head)
{
node_t *cur;
node_t *cur1 = head1;
node_t *cur2 = head2;
int oldcarry = 0, sum = 0;
while(cur1 || oldcarry)
{
if(cur1)
{
sum = cur1->n + cur2->n;
cur1 = cur1->next, cur2 = cur2->next;
}
sum += oldcarry;
printf("sum = %d, oldcarry = %d\n", sum, oldcarry);
cur = malloc(sizeof(node_t));
if(sum >= 10)
{
cur->n = sum - 10;
oldcarry = 1;
}
else
{
cur->n = sum;
oldcarry = 0;
}
sum = 0;
cur->next = head;
head = cur;
}
return head;
}
int main(int argc, char *argv[])
{
node_t *head1 = NULL, *head2 = NULL, *head = NULL;
head1 = creat(head1, "11111");
head2 = creat(head2, "54321");
show(head1);
show(head2);
head = add(head1, head2, head);
show(head);
return 0;
}
/*
双向链表的实现
*/
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 3
typedef struct node *link_t;
typedef struct node
{
int data;
link_t prev;
link_t next;
}node_t;
static link_t head = NULL;
static link_t tail = NULL;
link_t make_node(int item)
{
link_t p = (node_t *)malloc(sizeof(node_t));
if (p != NULL)
{
p->data = item;
p->prev = p->next = NULL;
}
return p;
}
void free_node(link_t p)
{
free(p);
}
link_t link_search(int key)
{
link_t p;
for (p = head->next; p != tail; p = p->next)
if (p->data == key)
return p;
return NULL;
}
void link_delete(link_t p)
{
p->prev->next = p->next;
p->next->prev = p->prev;
}
void link_traverse(void(*visit)(link_t))
{
link_t p;
for (p = head->next; p != NULL; p = p->next)
visit(p);
}
void link_destroy(void)
{
link_t q, p = head->next;
head->next = tail;
tail->prev = head;
while (p != tail)
{
q = p;
p = p->next;
free_node(q);
}
}
void link_print(link_t p)
{
printf("%d\n", p->data);
}
void link_insertByHead(link_t p)
{
p->prev = head;
p->next = head->next;
if (head->next != NULL)//如果不是第一次插入,要注意下
head->next->prev = p;
head->next = p;
}
void link_insertByTail(link_t p)
{
p->prev = tail;
p->next = NULL;
tail->next = p;
tail = p;
}
link_t CreateDbLinkList(void)
{
int i = 0, length = 0, data = 0;
link_t node = NULL;
head = tail = (link_t)malloc(sizeof(node_t));
if (NULL == head)
{
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
head->next = NULL;
head->prev = NULL;
tail->next = NULL;
tail->prev = NULL;
for (i = 1; i <= LENGTH; i++)
{
node = make_node(i);
node->data = i;
link_insertByHead(node);
}
return head;
}
int main(void)
{
head = CreateDbLinkList();
link_traverse(link_print);
link_t p = link_search(2);
link_delete(p);
free_node(p);
link_traverse(link_print);
link_t q = make_node(4);
link_insertByHead(q);
link_traverse(link_print);
link_destroy();
return 0;
}
/*
双向链表实现一个队列
*/
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 5
typedef struct node
{
int data;
node* prev;
node* next;
} Node;
typedef struct queue
{
Node* head;
Node* tail;
} LinkDQueue;
//创建队列函数
LinkDQueue* CreatDQueuelist()
{
LinkDQueue* queue = (LinkDQueue *)malloc(sizeof(LinkDQueue));
queue->head = queue->tail = (Node *)malloc(sizeof(Node));
queue->head->data = 0;
queue->head->prev = NULL;
queue->head->next = NULL;
for (int i = 1; i <= LENGTH; i++)
{
Node* pnew = (Node *)malloc(sizeof(Node));
if (NULL == pnew)
printf("内存分配失败!");
pnew->data = i;
pnew->next = NULL;
queue->tail->next = pnew;
pnew->prev = queue->tail;
queue->tail = pnew;
}
return queue;
}
//入队函数
void EnDQueuelist(LinkDQueue* q, int e)
{
int n = 0;
Node* tmp = (Node *)malloc(sizeof(Node));
tmp->data = e;
if (q->head == q->tail)
{
q->tail->next = tmp;
tmp->prev = q->tail;
tmp->next = NULL;
q->tail = tmp;
return;
}
tmp->next = NULL;
q->tail->next = tmp;
tmp->prev = q->tail;
q->tail = tmp;
}
int DeDQueuelist(LinkDQueue* q)
{
int data = 0;
if (!q || q->head == q->tail)
{
printf("队列为空!");
return data;
}
Node* tmp = NULL;
tmp = q->head->next;
data = tmp->data;
q->head->next = tmp->next;
if (q->tail == tmp)
q->tail = q->head;
else
tmp->next->prev = q->head;
free(tmp);
return data;
}
void PrintDQueuelist(LinkDQueue* q)
{
Node * tmp = q->head->next;
while (tmp)
{
printf("%d ", tmp->data);
tmp = tmp->next;
}
}
int GetlengthDQueuelist(LinkDQueue* q)
{
int length = 0;
Node* tmp = q->head->next;
while (tmp)
{
length++;
tmp = tmp->next;
}
return length;
}
int main()
{
LinkDQueue* queue = CreatDQueuelist();
PrintDQueuelist(queue);
int a = GetlengthDQueuelist(queue);
printf("%d\n", a);
EnDQueuelist(queue, 4);
PrintDQueuelist(queue);
a = GetlengthDQueuelist(queue);
printf("%d\n", a);
DeDQueuelist(queue);
PrintDQueuelist(queue);
return 0;
}