#include <iostream> #include <stdio.h> #include <string.h> #include <conio.h> using namespace std; typedef struct student { int data; struct student *next; }node; /* 链表的创建*/ node *creat() { node *head,*p,*s; int x; int cycle=1; head=(node*)malloc(sizeof(node)); p=head; while(cycle) { cout<<"please enter a number"<<endl; cin>>x; if(x!=0) { s=(node*)malloc(sizeof(node)); s->data=x; p->next=s; p=s; } else cycle=0; } head=head->next; p->next=NULL; return (head); } /*链表的测长*/ int length(node *head) { int n=0; node *p; p=head; while(p!=NULL) { p=p->next; n++; } return n; } /*链表的排序*/ node *sort(node* head, int n) { int i; int j; int temp; node *p; if(head==NULL||head->next==NULL) return (head); p=head; for(i=1;i<n;i++) { p=head; for(j=0;j<n-i;j++) { if(p->data>p->next->data) { temp=p->next->data; p->next->data=p->data; p->data=temp; } p=p->next; } } return (head); } /*链表的逆置*/ node *reverse(node* head) { node *p1; node *p2; node *p3; if(head==NULL||head->next==NULL) return head; p1=head; p2=p1->next; while(p2) { p3=p2->next; p2->next=p1; p1=p2; p2=p3; } head->next=NULL; head=p1; return head; } /*链表插入一个节点*/ node *insert(node* head,int num) { node *p0,*p1,*p2; p1=head; p0=(node*)malloc(sizeof(node)); p0->data=num; while((p0->data)>(p1->data)&&p1->next!=NULL) { p2=p1; p1=p1->next; } if(p0->data<=p1->data) { if(head==p1) //插入的是头结点 { p0->next=p1; head=p0; } else { p2->next=p0; //插入的是中间结点 p0->next=p1; } } else //插入的是尾结点 { p1->next=p0; p0->next=NULL; } return (head); } /*链表删除一个节点*/ node *del(node* head,int num) { node *p1,*p2; p1=head; while(num!=p1->data&&p1->next!=NULL) { p2=p1; p1=p1->next; } if(num==p1->data) { if(head==p1) { head=p1->next; free(p1); } else p2->next=p1->next; } else cout<<num<<"couldn't be found"<<endl; return (head); } void main() { node *p; node *head; int n; head=(node*)malloc(sizeof(node)); head=creat(); n=length(head); p=head; cout<<"原始链表是:"; if(head!=NULL) //原始链表的打印 while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; head=reverse(head); p=head; cout<<"链表长度为:"<<n; /**************************************************************/ cout<<"逆置后链表是:"; if(head!=NULL) //逆置后链表的打印 while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; /**************************************************************/ head=sort(head,n); p=head; cout<<"排序后链表:"; if(head!=NULL) //排序后链表的打印 while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; /**************************************************************/ int a; cout<<"insert a number:"<<endl; cin>>a; head=insert(head,a); p=head; cout<<"插入后链表是:"; if(head!=NULL) //插入后链表的打印 while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; /**************************************************************/ int b; cout<<"delete number:"<<endl; cin>>b; head=del(head,b); p=head; cout<<"删除后链表是:"; if(head!=NULL) //删除后链表的打印 while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; }
我自己完全用C语言版本的实现:
list.h
typedef struct ListNode { int val; struct ListNode *next; } Node; Node *list_init(void); //构建头节点head值为-1的单链表 void list_exit(Node **head); int list_is_empty(Node *head); void list_print(Node *head); int list_size(Node *head); Node *list_insert(Node *head, int n, int val); //在第n个节点之后插入 int list_delete(Node *head, int n); //删除第n个节点 int list_delete_val(Node *head, int val); //删除链表中值为val的第一个节点 int list_find(Node *head, int val); //查找链表中第一个节点值为val的节点位置 Node *list_local_reverse(Node *head, int L, int R); //局部反转链表第L个到第R个节点 Node *list_reverse(Node *head); //链表反转
list.c
#include <stdio.h> #include <stdlib.h> #include "list.h" int main(void) { Node *head = list_init(); list_print(head); printf("list size = %d\n", list_size(head)); list_insert(head, 0, 5); list_print(head); printf("list size = %d\n", list_size(head)); list_insert(head, list_size(head), 15); list_print(head); printf("list size = %d\n", list_size(head)); list_reverse(head); list_print(head); printf("list size = %d\n", list_size(head)); list_delete(head, 1); list_print(head); list_delete(head, list_size(head)); list_print(head); list_delete(head, 3); list_print(head); printf("list size = %d\n", list_size(head)); printf("find -1 in = %d\n", list_find(head, -1)); printf("find 5 in = %d\n", list_find(head, 5)); list_local_reverse(head, 1, 3); list_print(head); printf("list size = %d\n", list_size(head)); list_deinit(&head); list_print(head); list_size(head); printf("list size = %d\n", list_size(head)); return 0; } Node *list_init(void) { Node *head = (Node *)malloc(sizeof(Node)); Node *p1 = (Node *)malloc(sizeof(Node)); Node *p2 = (Node *)malloc(sizeof(Node)); Node *p3 = (Node *)malloc(sizeof(Node)); Node *p4 = (Node *)malloc(sizeof(Node)); Node *p5 = (Node *)malloc(sizeof(Node)); head->val = -1; p1->val = 11; p2->val = 5; p3->val = 7; p4->val = 10; p5->val = 1; head->next = p1; p1->next = p2; p2->next = p3; p3->next = p4; p4->next = p5; p5->next = NULL; return head; } void list_exit(Node **head) { while (*head) { Node** tmp = head; *head = (*head)->next; free(*tmp); *tmp = NULL; } } int list_is_empty(Node *head){ return (!head || !head->next) ? 1 : 0; } void list_print(Node *head) { int first = 1; while (head) { if (first) { first = 0; printf("head->"); } else { printf("(%d)->", head->val); } head = head->next; } printf("NULL\n"); } int list_size(Node *head) { int len = 0; if (!head) return len; head = head->next; while (head) { len++; head = head->next; } return len; } Node *list_insert(Node *head, int n, int val) { if (n < 0 || n > list_size(head)) return NULL; while (n--) { head = head->next; } Node *tmp = (Node *)malloc(sizeof(Node *)); tmp->val = val; tmp->next = head->next; head->next = tmp; return tmp; } int list_delete(Node *head, int n) { if (n < 1 || n > list_size(head)) return -1; while (--n) { head = head->next; } Node *tmp = head->next; head->next = head->next->next; free(tmp); tmp = NULL; return 0; } int list_delete_val(Node *head, int val) { list_delete(head, list_find(head, val)); } int list_find(Node *head, int val) { head = head->next; int ans = 1; while (head) { if (head->val == val) return ans; head = head->next; ans++; } return -1; } Node *list_local_reverse(Node *head, int L, int R) { if (!head || !head->next || R <= L || L < 1 || R > list_size(head)) return NULL; int t = L; while (--t){ head = head->next; } Node *h = head; head = head->next; Node *p = head; Node *q = head->next; Node *tmp = NULL; p->next = NULL; int flag = 1; while (flag != R - L + 1) { tmp = q->next; q->next = p; p = q; q = tmp; flag++; } h->next->next = tmp; h->next = p; return h; } Node *list_reverse(Node *head){ return list_local_reverse(head, 1, list_size(head)); }