链表操作

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夏与冬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值