注意:现在偷的懒以后都要补回来的!
希望大家认真学好数据结构,不希望后悔!
单链表删除 【问题描述】 设有头结点单链表,实现单链表删除。 【输入形式】 第一行输入N,表示单链表表长为N; 第二行输入N个整数,建立有头结点单链表; 第三行输入一个整数M,表示删除结点位置为M(即第M个元素)。 【输出形式】 若删除成功,先输出删除结点的值;下一行输出删除后单链表的所有元素; 若删除不成功,输出error。 【样例输入1】 5 10 20 30 40 50 2 【样例输出1】 20 10 30 40 50 【样例输入2】 10 10 20 30 40 50 60 70 80 90 100 0 【样例输出2】 error 【评分标准】 采用有头结点单链表存储,实现用算法函数完成。
# include <stdio.h>
# include <stdlib.h>
typedef struct Node {
int data;
struct Node * next;
} Node;
int main ( )
{
int n, pos, k= 0 ;
Node * node, * head, * p, * q;
scanf ( "%d" , & n) ;
head= ( Node * ) malloc ( sizeof ( Node) ) ;
head-> next= NULL ;
q= head;
for ( int i= 0 ; i< n; i++ ) {
node= ( Node * ) malloc ( sizeof ( Node) ) ;
scanf ( "%d" , & node-> data) ;
q-> next= node;
q= node;
}
q-> next= NULL ;
p= head;
scanf ( "%d" , & pos) ;
if ( pos> 0 && pos<= n) {
do {
q= p;
p= p-> next;
k++ ;
if ( k== pos) {
q-> next= p-> next;
}
} while ( p!= NULL ) ;
p= head-> next;
do {
printf ( "%d " , p-> data) ;
p= p-> next;
} while ( p!= NULL ) ;
} else {
printf ( "error" ) ;
}
return 0 ;
}
单链表查找 【问题描述】 设有头结点单链表,在链表中查找关键字值在链表中首次出现的位序。 【输入形式】 第一行输入一个整数N; 第二行输入N个整数,创建有头结点单链表; 后面进行若干次查找,每输入一个关键字值,输出查找结果。(利用scanf()的返回值判断是否仍有数据输入) 【输出形式】 若找到关键字值,输出其在链表中首次出现的位序; 若未找到,输出-1。 【样例输入】 5 12 34 96 -67 100 12 100 96 28 【样例输出】 1 5 3 -1 【评分标准】 采用单链表作为存储结构,查找实现用算法函数表示。
# include <stdio.h>
# include <stdlib.h>
typedef struct Node {
int data;
struct Node * next;
} Node;
int main ( )
{
int n, m, k;
Node * node, * head, * q, * p;
head= ( Node * ) malloc ( sizeof ( Node) ) ;
head-> next= NULL ;
q= head;
scanf ( "%d," , & n) ;
for ( int i= 0 ; i< n; i++ ) {
scanf ( "%d," , & m) ;
node= ( Node * ) malloc ( sizeof ( Node) ) ;
node-> data= m;
q-> next= node;
q= node;
}
q-> next= NULL ;
int flag= 0 , j;
while ( scanf ( "%d" , & k) == 1 ) {
j= 0 ;
p= head-> next;
while ( p) {
j++ ;
if ( k== p-> data) {
printf ( "%d\n" , j) ;
flag= 0 ;
break ;
} else {
flag= 1 ;
}
p= p-> next;
}
if ( ! p) {
printf ( "-1\n" ) ;
}
}
return 0 ;
}
有头结点单链表逆置 【问题描述】 设有头结点单链表,编写算法实现单链表逆置。 【输入形式】 第一行输入一个整数N; 第二行输入N个整数,以空格作为分隔,创建单链表; 【输出形式】 输出逆置后的单链表,,元素之间以空格分隔。 【样例输入】 5 10 20 30 40 50 【样例输出】 50 40 30 20 10 【评分标准】 采用单链表实现,逆置过程写成算法函数。(要求链表次序逆置,而不是仅逆序输出)
# include <stdio.h>
# include <stdlib.h>
typedef struct Node {
int data;
struct Node * next;
} Node;
int main ( )
{
int n, m;
Node * node, * head, * p;
head= ( Node * ) malloc ( sizeof ( Node) ) ;
head-> next= NULL ;
scanf ( "%d," , & n) ;
for ( int i= 0 ; i< n; i++ ) {
scanf ( "%d," , & m) ;
node= ( Node * ) malloc ( sizeof ( Node) ) ;
node-> data= m;
node-> next= head-> next;
head-> next= node;
}
p= head-> next;
while ( p) {
printf ( "%d " , p-> data) ;
p= p-> next;
}
return 0 ;
}
统计不带头结点的单链表长度(循环方法) 【问题描述】 统计不带头结点的单链表结点个数。 【输入形式】 重复输入数字建立不带头结点的单链表,输入字符结束。 【输出形式】 输出单链表结点的个数。 【样例输入】 2 3 4 5 6 e 【样例输出】 5 【评分标准】 在一个函数中用循环方法统计结点个数。
# include <stdio.h>
# include <stdlib.h>
typedef struct Node {
int data;
struct Node * next;
} Node;
int main ( )
{
int n;
Node * node, * head, * p;
head= NULL ;
while ( scanf ( "%d" , & n) == 1 ) {
node= ( Node * ) malloc ( sizeof ( Node) ) ;
node-> data= n;
node-> next= head;
head= node;
}
p= head;
int count= 0 ;
while ( p) {
count++ ;
p= p-> next;
}
printf ( "%d" , count) ;
return 0 ;
}
链表字符统计 【问题描述】单链表实现字符统计。 【输入形式】从键盘输入N个字符,字符以逗号隔开。 【输出形式】统计各字符出现的次数,并删除重复字符。 【样例输入】5,a,b,c,a,b 【样例输出】 a 2 b 2 c 1 【样例说明】键盘输入5个字符,分别为a,b,c,a,b,统计出各字符出现次数分别为2,2,1 【评分标准】要求以单链表形式实现。
# include <stdio.h>
# include <stdlib.h>
typedef struct Node {
char data;
int count;
struct Node * next;
} Node;
int main ( )
{
int n;
char m;
Node * node, * head, * q, * z, * p;
head= ( Node * ) malloc ( sizeof ( Node) ) ;
head-> next= NULL ;
scanf ( "%d," , & n) ;
for ( int i= 0 ; i< n; i++ ) {
q= head-> next;
scanf ( "%c," , & m) ;
if ( ! q) {
node= ( Node * ) malloc ( sizeof ( Node) ) ;
node-> data= m;
node-> count= 1 ;
node-> next= head-> next;
head-> next= node;
z= node;
continue ;
} else {
while ( q) {
if ( m== q-> data ) {
q-> count++ ;
break ;
} else {
q= q-> next;
}
}
if ( ! q) {
node= ( Node * ) malloc ( sizeof ( Node) ) ;
node-> data= m;
node-> count= 1 ;
z-> next= node;
z= node;
z-> next= NULL ;
}
}
}
p= head-> next;
while ( p) {
printf ( "%c %d\n" , p-> data, p-> count) ;
p= p-> next;
}
return 0 ;
}
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
typedef struct LNode
{
char ch;
int count;
struct LNode * next;
} LNode, * LinkList;
LinkList LocateElem ( LinkList L, char e)
{
LinkList p= L-> next;
while ( p&& p-> ch!= e)
p= p-> next;
return p;
}
LinkList CreateN ( int n)
{
LinkList head, p, q, f;
int i;
char e;
p= head= ( LNode* ) malloc ( sizeof ( LNode) ) ;
p-> next= NULL ;
for ( i= 1 ; i<= n; i++ )
{
scanf ( "%c," , & e) ;
f= LocateElem ( head, e) ;
if ( ! f)
{
q= ( LNode* ) malloc ( sizeof ( LNode) ) ;
q-> ch= e;
q-> count= 1 ;
p-> next= q;
p= q;
p-> next= NULL ;
}
else
f-> count++ ;
}
return head;
}
void PrintList ( LinkList L)
{
LinkList p= L-> next;
while ( p)
{
printf ( "%c %d\n" , p-> ch, p-> count) ;
p= p-> next;
}
}
int main ( )
{
int n;
LinkList L;
scanf ( "%d," , & n) ;
L= CreateN ( n) ;
PrintList ( L) ;
return 0 ;
}