#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode{
int val;
struct LNode *next;
int length; //链表长度
}LNode,*LinkList;
void print(LinkList h);
LNode * GetElem(LinkList L,int i);
LinkList List_HeadInsert(LinkList &L );
LinkList reverse_node_1(LinkList L);
LNode *get_k_node(LinkList L,int k);
LNode * removeDupicateNodes(struct LNode * head);
LNode * reverse_node( LNode* headtest);
int data[6]={1, 2,3,4,5,6};
int main(){//[1, 2, 3, 3, 2, 1]
LinkList L;
LNode *q;
LNode *t;
int x;
L=List_HeadInsert(L);
print (L);
printf("\n");
t=reverse_node(L);
print (t);
return 0;
}
LinkList List_HeadInsert(LinkList &L ){
LNode *s;
int x,i=0;
L=(LinkList)malloc(sizeof(LNode));//建立头结点
LNode*r =L;
while(i<=5){ //输入9999表示输入结束
s=(LinkList)malloc(sizeof(LNode));//建立要插入的结点
s->val=data[i]; //输入结点值
r->next = s; //尾插法
r=s; //尾插法
i++;
}
r->next=NULL;//尾插法
L->length=i+1;
return L;
}
void print(LinkList h){//打印带头结点的单链表
LinkList p=h->next;
while(p!=NULL){
printf("%d ",p->val);
p=p->next;
}
}
LNode * removeDupicateNodes(struct LNode * head){ //删除重复的结点
if(head == NULL) return NULL;
struct LNode *current = head;
while(current){
struct LNode * p=current;
while(p->next){
if(p->next->val == current->val){
p->next = p->next->next;
}
else{
p=p->next;
}
}
current = current->next;
}
return head;
}
LNode * GetElem(LinkList L,int i){//寻找第i个位置的结点
int j=1;
LNode *p=L->next;
if(i==0)return L;
if(i<1)return L;
while(p&& j<i){
p=p->next;
j++;
}
return p;
}
LinkList reverse_node_1(LinkList L){//链表的逆置法1
LNode*p,*r;
p= L->next;
L->next=NULL;
while(p!=NULL){
r=p->next;
p->next=L->next;
L->next=p;
p=r;
}
return L;
}
LNode *get_k_node(LinkList L,int k){ //传回链表倒数第K个位置的值 并打印
LNode *q;
q=NULL;
q=GetElem(L,(L->length)-k);
//printf("%d",q->val);
return q;
}
LNode * reverse_node( LNode* headtest ){ //链表的逆置法2
if(headtest ==NULL || headtest->next==NULL)
return headtest;
else
{
LNode* former = NULL;
LNode* mid = headtest->next;
LNode* latter = NULL;
LNode * L;
L=(LinkList)malloc(sizeof(LNode));
L->next= NULL;
while(mid!=NULL){
latter = mid->next;
mid->next = former;//mid->next = NULL;
former = mid; //f= NULL;-> f = m;
mid = latter ;
}
L->next=former;
return L;
}
}
链表基本函数操作(带头结点的单链表)
于 2021-09-21 23:41:08 首次发布