指针最基础的东东(主要看意思)或许每个人都有自己写链表的方法,这里主要记录我的链表历程/手动滑稽
struct lnode
{
int data;
linklist next;
}lnode;
typedef lnode* linklist;
#include<stdlib.h>
#include<stdio.h>
void create(linklist &l,int n)
{
linklist p;
l=(linklist)malloc(sizeof(lnode));
l->next=NULL;
for(int i=1;i<=n;i++)
{
p=(linklist)malloc(sizeof(lnode));
scanf("%d",&p->data);
p->next=l->next;
l->next=p;
}
}
#include<stdlib.h>
#include<stdio.h>
void create(linklist &l,int n)
{
linklist p1,p2;
l=(linklist)malloc(sizeof(lnode));
p1=l;
for(int i=1;i<=n;i++)
{
p2=(linklist)malloc(sizeof(lnode));
scanf("%d",&p2->data);
p1->next=p2;
p1=p1->next;
}
p1->next=NULL;
}
bool chazhao(linklist l,int i,int &e)
{
linklist p;
p=l->next;
if(i<1) return false;
for(int j=1;p&&j<=i-1;j++) p=p->next;
if(!p) return false;
e=p->data;
return true;
}
bool charu(linklist &l,int i,int example)
{
linklist p,temp;
p=l->next;
if(i<1) return false;
for(int j=1;p&&j<=i-2;j++) p=p->next;
if(!p) return false;
temp=(linklist)malloc(sizeof(lnode));
temp->data=example;
temp->next=p->next;
p->next=temp;
return true;
}
bool shanchu(linklist &l,int i)
{
linklist p,temp;
p=l->next;
if(i<1) return false;
for(int j=1;p&&j<=i-2;j++) p=p->next;
if(!p) return false;
temp=p->next;
p->next=temp->next;
free(temp);
return true;
}
题目:1奇数表
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
2 2 4 6
作者: C课程组
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
*/
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printlist(Odd);
printlist(L);
return 0;
}
struct ListNode *readlist()
{
struct ListNode *lt,*p1,*p2;
lt=(struct ListNode*)malloc(sizeof(struct ListNode));
p1=lt;
while(1)
{
int a;
scanf("%d",&a);
if(a==-1) break;
else
{
p2=(struct ListNode*)malloc(sizeof(struct ListNode));
p2->data=a;
p1->next=p2;
p1=p1->next;
}
}
p1->next=NULL;
return lt->next;
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *p1,*p2,*l2,*p;
l2=(struct ListNode*)malloc(sizeof(struct ListNode));
p1=l2;
p=*L;
while(p)
{
if(p->data%2==1)
{
p2=(struct ListNode*)malloc(sizeof(struct ListNode));
p2->data=p->data;
p1->next=p2;
p1=p1->next;
}
p=p->next;
}
p1->next=NULL;
p=*L;
while(p->next)
{
if((p->next)->data%2==1) p->next=p->next->next;
else p=p->next;
}
p=*L;
if(p->data%2==1) *L=p->next;
return l2->next;
}
2头结点带不带数据试了才知道
PtrToNode Next;
};
typedef PtrToNode List;
L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read();
void Print( List L );
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
输入样例:
3
1 3 5
5
2 4 6 8 10
输出样例:
1 2 3 4 5 6 8 10
NULL
NULL
作者: DS课程组
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
*/
List Merge( List L1, List L2 )
{
List l,p1,p2,pl1,pl2;
l=(struct Node*)malloc(sizeof( struct Node));
p1=l;
pl1=L1->Next;
pl2=L2->Next;
while((pl1!=NULL)&&(pl2!=NULL))
{
if(pl1->Data<=pl2->Data)
{
p2=(struct Node*)malloc(sizeof( struct Node));
p2->Data=pl1->Data;
p1->Next=p2;
p1=p1->Next;
pl1=pl1->Next;
}
else
{
p2=(struct Node*)malloc(sizeof( struct Node));
p2->Data=pl2->Data;
p1->Next=p2;
p1=p1->Next;
pl2=pl2->Next;
}
}
if(pl1==NULL) p1->Next=pl2;
if(pl2==NULL) p1->Next=pl1;
L1->Next=NULL;
L2->Next=NULL;
return l;
}