首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

链表处置

2013-11-08 
链表处理由于准备面试笔试,复习了下数据结构,没有加删除操作.下面是代码,不加注释了,学数据结构的应该都能

链表处理

由于准备面试笔试,复习了下数据结构,没有加删除操作.下面是代码,不加注释了,学数据结构的应该都能看懂,也没加异常处理,默认分配内存都能成功.

#include<stdio.h>#include<stdlib.h>#include<assert.h>struct node{int data;struct node *next;}linknode;typedef struct node * LinkNode;LinkNode head = NULL;LinkNode createNode(int data){LinkNode node = NULL;node = (LinkNode)malloc(sizeof(linknode));node->data = data;node->next = NULL;return node;}//在insert函数中返回head后head的值就不会为空,而不返回head时就返回空LinkNode insert(LinkNode head, int data){if(head == NULL){head = createNode(data);return head;}LinkNode node = NULL;node = createNode(data);node->data = data;node->next = head->next;head->next = node;return head;}void traverse(LinkNode head){LinkNode p = NULL;p = head;while( NULL != p){printf("%d ", p->data);p = p->next;}}void linkListFree(LinkNode head){assert(head != NULL);LinkNode p = head;LinkNode q;while( NULL != p){q = p->next;free(p);p = NULL;p = q;}}LinkNode reverse(LinkNode head){assert(head != NULL);LinkNode ptr = createNode(-1);ptr->next = head;LinkNode p = head->next;head->next = NULL;//必须对head->next置空,不然出现循环LinkNode q = NULL;while(p != NULL){q = p->next;p->next = ptr->next;ptr->next = p;p = q;}return ptr->next;}//无头单链表删除节点void deleteRandomNode(LinkNode p){assert(p != NULL);LinkNode n = p->next;if(n != NULL){p->data = n->data;p->next = n->next;free(n);n = NULL;}}//判断两个链表是否相交bool isIntersect(LinkNode headone, LinkNode headtwo){assert( (headone!=NULL) && (headtwo!=NULL) );LinkNode p = headone;while(p->next != NULL){p = p->next;}LinkNode q = headtwo;while( (NULL != q) && (q != p) ){q = q->next;}if(q == NULL)return false;return true;}//如果相交找到相交的第一个节点LinkNode firstIntersectNode(LinkNode headone, LinkNode headtwo){assert( (NULL != headone) && (NULL != headtwo) );int lenone = 0, lentwo = 0;LinkNode p = headone;while(NULL != p){lenone++;p = p->next;}p = headtwo;while(NULL != p){lentwo++;p = p->next;}if(lenone < lentwo){p = headtwo;for(int i=0; i<(lentwo-lenone); i++){p = p->next;}LinkNode q = headone;while( (NULL != p) && (NULL != q) ){if(p == q)return p;else{p = p->next;q = q->next;}}}else if(lenone > lentwo){p = headone;for(int i=0; i<(lenone-lentwo); i++){p = p->next;}LinkNode q = headtwo;while( (NULL != p) && (NULL != q) ){if(p == q)return p;else{p = p->next;q = q->next;}}}else{p = headone;LinkNode q = headtwo;while( (NULL != p) && (NULL != q) ){if(p == q)return p;else{p = p->next;q = q->next;}}}}void test(){for(int i=0; i<20; i++){head = insert(head, i+2);}traverse(head);printf("\n");LinkNode h = reverse(head);LinkNode p = h;traverse(h);}int main(){test();return 0;}


热点排行